zoukankan      html  css  js  c++  java
  • 正式班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 ~]# 
      
  • 相关阅读:
    计算机系统概述
    Qt学习--初学注意事项
    Qt实现一个简单的TextEditor
    Qt 用户登录界面
    C++ 模板
    多态与虚函数
    继承与派生
    C++ 运算符重载
    web安全-点击劫持
    web安全问题-cookie
  • 原文地址:https://www.cnblogs.com/caojiaxin/p/13866380.html
Copyright © 2011-2022 走看看