• 文本处理三剑客


    文本处理三剑客

    grep sed awk

    sed是可以不打开文件进行增删改查,vim的缺点是打开文件会把文件加载到我们的内存中,占用我们的内存,sed不会把文件加载到内存当中。

    要先观察格式

    格式

    sed 选项 sed命令 文件名

    sed选项

    不输出模式空间里的内容

    -n 

    执行多条sed命令

    -e 

    使用拓展正则时用

    -r 

    直接修改文件内容

    -i 

    sed命令

    追加在指定行的下面

    a 

    如何追加多行

    sed '2i ok
    ok1
    ok3' 文件名

    取代指定行

    c 

    删除,可以支持多行,比如1,3就是第一行和第三行

    d 

    删除所有行

    sed 'd' 文件名

    插入在指定行的上面

    i 

    输出指定内容

    p 

    一般结合-n使用

    sed '/root/p' –n /etc/passwd

    取反,放在命令前面

    sed用法总结

    1.查找指定的字符串

    例子:显示/etc/passwd中保含root的行(显示模式空间中的内容)

    方法1

    sed '/root/p' /etc/passwd

    方法2

    cat /etc/passwd | sed '/root/p'

    2.在指定的位置做增删

    例子:删除以root为开头的行

    sed '/^root/d' a.txt

    例子:在包含root的行后添加一行 i am ken

    sed '/root/a i am ken' a.txt

    3.按行替换

    例子:将5到9行的内容替换为 i am ken

    sed '5,9c i am ken' a.txt

    4.按照字符替换

    例子:将/etc/selinux/config中的SELINUX=enforcing改成 disabled

    写法1

    sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' config

    写法2

    sed -r -i 's/(SELINUX=)disabled/1enforcing/g' config

    5.查找指定的内容再做替换

    例子:将以r开头的行中的oo替换为qq

    sed '/^r/{s/oo/qq/g}' passwd

    6.多点编辑

    例子:去除文件中的注释行和空白行

    grep -v -E "(^#)|(^$)" passwd.bak >passwd
    
    cat passwd.bak | sed -e '/^#/d' -e '/^$/d' >passwd

    7.取反操作

    显示非1-3行

    sed -n '1,3!p' passwd

    awk不仅是系统命令,也是编程语言

    格式

    awk awk参数 ‘匹配的是什么东西{对这个东西做什么}’ file

    常用参数只有一个 –F 指定分隔符

    几个小概念

    记录(record):一行就是一个记录

    分隔符(field separator):进行对记录进行切割的时候所使用的字符

    字段(field):将一条记录分割成的每一段

    FILENAME:当前处理文件的文件名

    FS(Field Separator):字段分隔符(默认是以空格为分隔符=)

    NR(Number of Rrecord):记录的编号(awk每读取一行,NR就加1==)

    NF(Number of Field):字段数量(记录了当前这条记录包含多少个字段==)

    1. 结合内置变量,打印指定的几行,以及字段数量

    例子;输出有多余5个字段的行的第三个字段

    cat a.sh | awk -F ":" 'NF>=5{print $3}'

    例子:输出每行行号和该行有几个字段

    cat a.sh | awk -F ":" '{print NR,NF}'

    例子:输出用户名,要求所有用户显示在同一行,而且用空格分隔

    cat mypwd | awk 'BEGIN{FS=":"; ORS=" "}{print $1}'

    2. 结合正则来匹配一行或者某个字段

    例子:输出用户名以s为开头的用户的uid

    cat mypwd | awk -F ":" '/^s/{print $}'

    例子:输出第五个字段是以t为结尾的用户的姓名

    cat mypwd | awk -F ":" '$5~/t$/{print $1}'

    3. 采用比较符号来进行打印指定的某些行

    例子:实现仅仅输出3-5的内容,每行前面添加一个行号

    cat mypwd | awk 'NR>=3&&NR<=5{print NR,$1}'

    cat mypwd | awk 'NR==3,NR==5{print NR,$1}'

    例子:实现仅仅输出3 和 5 和 7行的内容,每行前面添加一个行号

    cat mypwd | awk 'NR==3||NR==5||NR==7{print NR,$1}'

    4. END

    例子:统计mypwd中以#开头的行有多少行

    cat mypwd | awk 'BEGIN{n=0}/^#/{n+=1}END{print n}'

    统计:mypwd中,以:为分隔符,字段数量在3-5的行的数目

    cat mypwd  | awk 'BEGIN{FS=":"}NF>=3&&NF<=5{n+=1}END{print n}'

    5. ip

    例子:统计IP

    [root@ken]# cat url.txt | awk -F "/+" '{urls[$2]++}END{for(key in urls)print key, urls[key]}’
    
    www.baidu.com 12
    
    haha.baidu.com 1
    
    ftp.baidu.com 6
    
    mail.baidu.com 7
  • 相关阅读:
    Eclipse 下找不到或无法加载主类的解决办法
    程序 查看 jvm版本
    BaseAdapter优化深入分析
    android自定义UI模板图文详解
    android注解使用详解(图文)
    Unity随机Prefab,自动前往某点处理
    三分钟学会缓存工具DiskLruCache
    怎样判断一个股权众筹项目是否靠谱?
    P2P借款的几种情况
    android开发必备日志打印工具类
  • 原文地址:https://www.cnblogs.com/shuaiyin/p/10917158.html
Copyright © 2020-2023  润新知