正式班D14

2020.10.23星期五  正式班D14

9.5 文件处理三剑客(支持|)

9.5.1 sed流式编辑器

  • 事先制定好编辑文件的指令,让sed自动完成对文件的整体编辑(同一时间内存中只有文件中一条)

    # 用法
    sed 选项 '定位 + 命令' 文件路径
    
    # 选项
    -n  # 取消默认输出
    -i  # 取消输出流向(将输出到屏幕中的内容流向文件即立即编辑文件)
    
    # 定位
    行定位:
    	1定位到第一行
        1,3代表从第一行到第三行
        不写定位代表定位到所有行
    正则表达式定位:
    	/ccc/  # 包含ccc的行
        /^ccc/  # 以ccc开头的行
        /ccc$/  # 以ccc结尾的行
    数字+正则表达式定位
    	"1,8p"  # 代表打印第一到第八行
        "1,/ccc/p"  # 代表取从第一行到首次匹配到/ccc/的行
        
    # 命令
    d  # 删除
    p  # 打印
    s///gi  #查找替换,s表示所有行,g表示一整行,i表示不区分大小写
    命令可以用";"来连接多条,如1d;3d;5d代表删除1,3,5行
    
    ================================================
    [root@ccc ~]# cat a.txt 
    ccc
    111ccc
    111ccc111
    ccc111ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    # i在第二行上面加上222,a是在下面
    [root@ccc ~]# sed '2i 222' a.txt  
    ccc
    222
    111ccc
    111ccc111
    ccc111ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# 
    
    =====================p的用法=====================
    [root@ccc ~]# sed '' a.txt 
    ccc
    111ccc
    111ccc111
    ccc111ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# sed -n '' a.txt 
    [root@ccc ~]# 
    [root@ccc ~]# sed -n '1,/111ccc111/p' a.txt 
    ccc
    111ccc
    111ccc111
    [root@ccc ~]#
    
    =====================d的用法=====================
    [root@ccc ~]# cat a.txt 
    ccc
    111ccc
    111ccc111
    ccc111ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# sed '1,/111ccc111ccc/d' a.txt 
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# sed '1d;3d;5d;7d' a.txt 
    111ccc
    ccc111ccc
    111Ccc
    [root@ccc ~]#
    
    =====================s///gi的用法=====================
    
    [root@ccc ~]# cat a.txt 
    ccc
    111ccc
    111ccc111
    ccc111ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# sed 's/ccc/yyy/g' a.txt   # 将所有行所有ccc改为yyy
    yyy
    111yyy
    111yyy111
    yyy111yyy
    111yyy111yyy
    111Ccc
    CcC111cCc111yyy
    [root@ccc~]#sed 's/ccc/yyy/gi' a.txt # 将所有行所有ccc(不区分大小写)改为yyy
    yyy
    111yyy
    111yyy111
    yyy111yyy
    111yyy111yyy
    111yyy
    yyy111yyy111yyy
    [root@ccc~]#sed '/^ccc/s/111/222/g' a.txt #将所有以ccc开头的行的111改为222
    ccc
    111ccc
    111ccc111
    ccc222ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# sed '1,3s/ccc/zzz/g' a.txt #将1~3行的ccc改为zzz
    zzz
    111zzz
    111zzz111
    ccc111ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# 
    
    =====================sed搭配管道|的用法=====================
    [root@ccc ~]# cat a.txt 
    ccc
    111ccc
    111ccc111
    ccc111ccc
    111ccc111ccc
    111Ccc
    CcC111cCc111ccc
    [root@ccc ~]# cat a.txt | sed '2,6d'  # 将a.txt的2~6行删掉
    ccc
    CcC111cCc111ccc
    [root@ccc ~]#
    

9.5.2 awk

  • 处理有规律的文本,做一些格式化处理(awk实际上是一门编程语言)

  • 例如/etc/passwd这种

    # 用法
    awk 选项 'pattern{action}' 文件路径
    
    # 选项
    -F  # 指定分隔符(后面可以接,: 等)
    不加默认以空格分隔  # 连续空格视为1个
    
    # awk -F:'{print $1,$3}' /etc/passwd的工作流程
    1、awk会读取文件的一行内容然后赋值给$0
    2、awk会以-F指定的分隔符将该段切分成n段(最多100段),第一段给$1,第二段给$2,依次递推
    3、print输出该行的第一第三段(逗号表示输出分隔符,默认与-F保持一致)
    4、重复123直到文件内容读完
    
    # 内置变量
    $0  # 一整行内容
    NR  # 记录号,等同于行号
    NF  # 以-F分隔符分割的段数
    
    # pattern的种类
    正则
        /正则/  # 该行内容匹配成功正则
        $1 ~ /正则/  # 第一段内容匹配成功正则
        $1 !~ /正则/  # 第一段内容没有匹配成功正则
    比较运算
    	NR >= 3 && NR <= 5  # 3~5行
        $1 == "root"  # 第一段内容等于root
    
    # action的类型
    print $1,$3
    
    =====================用法示例=====================
    [root@ccc ~]# cat 1.py
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    # 以root开头的行打印第一段和第三段
    [root@ccc ~]# awk -F: '/^root/{print $1,$3}' 1.py
    root 0
    # 第一段内容以d开头的打印第一和第三段
    [root@ccc ~]# awk -F: '$1 ~ /^d/{print $1,$3}' 1.py 
    daemon 2
    # 第一段内容不是以d开头的打印第一和第三段(取反)
    [root@ccc ~]# awk -F: '$1 !~ /^d/{print $1,$3}' 1.py
    root 0
    bin 1
    adm 3
    lp 4
    # 第四行以后的行打印第一段
    [root@ccc ~]# awk -F: 'NR>4{print $1}' 1.py 
    lp
    # 第一段内容是root的,打印整行
    [root@ccc ~]# awk -F: '$1 == "root"{print $0}' 1.py 
    root:x:0:0:root:/root:/bin/bash
    # awk支持管道
    [root@ccc ~]# cat 1.py | awk -F: '{print $1}'
    root
    bin
    daemon
    adm
    lp
    [root@ccc ~]#
    

9.5.3 grep

  • 从一堆杂乱无章的内容中过滤

    # 用法
    grep 选项 '正则' 文件路径
    
    # 选项
    -n  # --line-number 在过滤出的每行前面加上他在文件中的相对行号
    -i  # --ignore-case 忽略大小写
    --color  # 颜色
    -l  # --files-with-matches 如果匹配成功,则将文件名打印出来,失败不打印
    -r  # --recursive  递归,在查找的文件夹下寻找,匹配成功返回文件名,失败不打印
    通常-rl一起用  grep -rl 'rppt' /etc
    
    =====================用法示例=====================
    [root@ccc ~]# grep 'root' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@ccc ~]# grep -n 'bash$' /etc/passwd
    1:root:x:0:0:root:/root:/bin/bash
    [root@ccc ~]# grep -rl 'bash$' /etc
    /etc/pki/tls/certs/renew-dummy-cert
    /etc/crontab
    /etc/libuser.conf
    
    =====================管道|========================
    [root@ccc ~]# ps aux |grep ssh  # 查看包含ssh的进程
    root        802  0.0  0.4 112924  4328 ?        Ss   10:06   0:00 /usr/sbin/sshd -D
    root       1483  0.0  0.6 161536  6092 ?        Ss   14:33   0:00 sshd: root@pts/0
    root       1851  0.0  0.0 112824   980 pts/0    R+   19:52   0:00 grep --color=auto ssh
    [root@ccc ~]# ps aux |grep [s]sh  # 不包括刚输命令的进程
    root        802  0.0  0.4 112924  4328 ?        Ss   10:06   0:00 /usr/sbin/sshd -D
    root       1483  0.0  0.6 161536  6092 ?        Ss   14:33   0:00 sshd: root@pts/0
    [root@ccc ~]# 
    
posted @ 2020-10-23 21:35  drrug  阅读(72)  评论(0编辑  收藏  举报