正式班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 ~]#