本文共 6882 字,大约阅读时间需要 22 分钟。
sed、awk工具可以实现文本替换并且把替换的文本输出到屏幕上
sed和awk都是流式编辑器,是针对文档的行来操作的。sed通常用来替换操作。
示例的文本内容,以下操作根据此文本。
1 2 3 4 5 6 7 | [root@yonglinux ~] # cat test.txt rot:x:0:0:rot: /rot : /bin/bash root:x:0:0:root: /root : /bin/bash daemon:x:2:2:daemon: /sbin : /sbin/nologin rooooot:x:0:0 /roooooot : /bin/bash 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
1、打印某一行
sed -n 'n'p filename
单引号内的n是一个数字,表示第几行;p也可以写到引号内;
示例,打印passwd第3-5行;
1 2 3 4 | [root@yonglinux ~] # sed -n '3,5'p /etc/passwd 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 |
打印所有行
1 | [root@yonglinux ~] # sed -n '1,$'p /etc/passwd |
打印某一行,并且要显示行号,需要和grep一起使用;
1 2 | [root@localhost ~] # grep -n '.*' test.txt | sed -n '1'p 1:rrt |
2、打印包含某个字符串的行
字符串需要用/ /括起来;grep中的特殊符号^ $ . * 同样适用于sed中。
1 2 3 | [root@yonglinux ~] # sed -n '/root/'p /etc/passwd root:x:0:0:root: /root : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin |
打印包含/sbin/nologin的行,/需要进行脱意;
1 2 3 4 5 | [root@yonglinux ~] # sed -n '/\/sbin\/nologin/'p passwd 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 |
打印以d开头的行;打印以in结尾的;打印r与o字母中间有2个任意字符的;打印包含2个o及多个o的行;
1 2 3 4 5 6 7 8 9 | [root@yonglinux ~] # sed -n '/^d/'p test.txt daemon:x:2:2:daemon: /sbin : /sbin/nologin [root@yonglinux ~] # sed -n '/in$/'p test.txt daemon:x:2:2:daemon: /sbin : /sbin/nologin [root@yonglinux ~] # sed -n '/r..o/'p test.txt rooooot:x:0:0 /roooooot : /bin/bash [root@yonglinux ~] # sed -n '/ooo*/'p test.txt root:x:0:0:root: /root : /bin/bash rooooot:x:0:0 /roooooot : /bin/bash |
3、-e可以实现多个行为
1 2 3 | [root@yonglinux ~] # sed -e '1'p -e '/111/'p -n test.txt rot:x:0:0:rot: /rot : /bin/bash 11111111111111111111111111111111 |
可以用-e写多个;-e相当于传送带,先匹配最前面的打印,再匹配后面的打印,所以第一行会打印2次;
1 2 3 4 5 6 | [root@localhost ~] # sed -e '/root/p' -e '/bash/p' -n 1.txt root:x:0:0:root: /root : /bin/bash root:x:0:0:root: /root : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin user1:x:500:500:: /home/user1 : /bin/bash user2:x:501:501:: /home/user2 : /bin/bash |
-e后面也可以用;分号;-n不能写到-e的后面,可以写在-e的前面或最后面;
1 2 3 4 5 6 | [root@localhost ~] # sed -e '/root/p;/bash/p' -n 1.txt root:x:0:0:root: /root : /bin/bash root:x:0:0:root: /root : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin user1:x:500:500:: /home/user1 : /bin/bash user2:x:501:501:: /home/user2 : /bin/bash |
4、删除某行或者多行
‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。
示例,删除第一行;删除1-3行;删除包含root关键词的行;删除第3行到最后一行所有行;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@yonglinux ~] # sed '1'd test.txt root:x:0:0:root: /root : /bin/bash daemon:x:2:2:daemon: /sbin : /sbin/nologin rooooot:x:0:0 /roooooot : /bin/bash 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [root@yonglinux ~] # sed '1,3'd test.txt rooooot:x:0:0 /roooooot : /bin/bash 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [root@yonglinux ~] # sed '/root/'d test.txt rot:x:0:0:rot: /rot : /bin/bash daemon:x:2:2:daemon: /sbin : /sbin/nologin rooooot:x:0:0 /roooooot : /bin/bash 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [root@yonglinux ~] # sed '3,$'d test.txt rot:x:0:0:rot: /rot : /bin/bash root:x:0:0:root: /root : /bin/bash |
5、替换字符或替换字符串
示例,替换第一行字母r为R;替换1-2行中ot为to;替换所有行中ot为to;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@localhost ~] # sed '1s/r/R/g' test.txt RRt [root@yonglinux ~] # sed '1,2s/ot/to/g' test.txt rto:x:0:0:rto: /rto : /bin/bash roto:x:0:0:roto: /roto : /bin/bash daemon:x:2:2:daemon: /sbin : /sbin/nologin rooooot:x:0:0 /roooooot : /bin/bash 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [root@yonglinux ~] # sed 's#ot#to#g' test.txt rto:x:0:0:rto: /rto : /bin/bash roto:x:0:0:roto: /roto : /bin/bash daemon:x:2:2:daemon: /sbin : /sbin/nologin rooooto:x:0:0 /roooooto : /bin/bash 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
与vim编辑器里面替换一样的命令格式,s代表替换,g代表全局,不加g的话只替换行的第一个;可以使用# @作为分隔符。
1s代表只替换第一行;1,3s代表第一行到第三行;不加行数的话默认为全部行。
示例,删除文档中所有的数字's/[0-9]//g' 如删除文档中所有的字母's/[a-zA-Z]//g'删除所有的数字和字母's/[0-9a-zA-Z]//g'
1 2 3 4 5 6 | [root@yonglinux ~] # sed 's/[0-9]//g' test.txt rot:x:::rot: /rot : /bin/bash root:x:::root: /root : /bin/bash daemon:x:::daemon: /sbin : /sbin/nologin rooooot:x:: /roooooot : /bin/bash aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
示例,删除文档中所有的字母
1 2 3 4 5 6 | [root@yonglinux ~] # sed 's/[a-z]//g' 1.txt ::0:0:/: // ::11:0::/: // ::11:0::/: // ::0:0:/: // 1111111111111111111111111111111 |
示例,删除文档中不是英文字母的(数字和特殊符号)
1 2 3 4 5 6 | [root@yonglinux ~] # sed 's/[^a-z]//g' 1.txt rotxrotbinbash operatorxoperatorrootsbinnologin operatorxoperatorroootsbinnologin rooootxroooootbinbash aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
示例,删除文档中不是数字的(英文字母和特殊符号)
1 2 3 4 5 6 | [root@yonglinux ~] # sed 's/[^0-9]//g' 1.txt 00 110 110 00 1111111111111111111111111111111 |
示例,把文档中的小写字母全部替换为大写字母 's/[a-z]/\u&/g'
1 2 3 4 5 6 7 | [root@yonglinux ~] # sed 's/[a-z]/\u&/g' 1.txt ROT:X:0:0: /ROT : /BIN/BASH OPERATOR:X:11:0:OPERATOR: /ROOT : /SBIN/NOLOGIN OPERATOR:X:11:0:OPERATOR: /ROOOT : /SBIN/NOLOGIN ROOOOT:X:0:0: /ROOOOOT : /BIN/BASH 1111111111111111111111111111111 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
示例,把文档中的大写字母全部替换为小写字母 's/[A-Z]/\l&/g'
1 2 3 4 5 6 7 | [root@yonglinux ~] # sed 's/[A-Z]/\l&/g' 1.txt rot:x:0:0: /rot : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin operator:x:11:0:operator: /rooot : /sbin/nologin roooot:x:0:0: /rooooot : /bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
替换的同时加-n p 打印特定的行;
1 2 | [root@yonglinux ~] # sed -n '1s/[a-z]/\u&/g'p 1.txt ROT:X:0:0: /ROT : /BIN/BASH |
6、调换二个字符串的位置
sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/'
[^:]非冒号,不是冒号的所有字符
-r, --regexp-extended 在脚本中使用扩展正则表达式; 加r选项的意思为后面不用再加脱意\
( )括号括起来是分段的意思,
\3\2\1 是代表3调换1,后面的内容调换到前面
示例,aa与ff调换;加-r选项不用加脱意符号\;不加-r ( )括号左右都需要加\脱意;调换多行用最后一个;
1 2 3 4 5 6 7 8 | [root@localhost ~] # cat 1.txt aa:bb:cc: dd :ee:ff [root@localhost ~] # sed -r 's/(aa)(.*)(ff)/\3\2\1/' 1.txt ff:bb:cc: dd :ee:aa [root@localhost ~] # sed 's/\(aa\)\(.*\)\(ff\)/\3\2\1/' 1.txt ff:bb:cc: dd :ee:aa [root@localhost ~] # sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 1.txt ff:bb:cc: dd :ee:aa |
示例,rot与/bin/bash进行调换
1 2 3 4 5 6 7 8 | [root@localhost ~] # grep 'rot' test.txt rot:x:0:0:rot: /rot : /bin/bash [root@localhost ~] # grep 'rot' test.txt |sed 's/\(rot\)\(.*\)\(\/bin\/bash\)/\3\2\1/' /bin/bash :x:0:0:rot: /rot :rot [root@localhost ~] # grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/\3\2\1/' sed :-e 表达式 #1,字符 18:“s”的未知选项 [root@localhost ~] # grep 'rot' test.txt |sed -r 's/(rot)(.*)(\/bin\/bash)/\3\2\1/' /bin/bash :x:0:0:rot: /rot :rot |
加-r 后()内的/bin/bash 也还需要脱意才可以;
-i 选项 直接替换字符,并且保存原文件里面。使用i选项前,记得备份原文件。
1 2 3 | [root@localhost ~] # sed -r -i 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 1.txt [root@localhost ~] # cat 1.txt ff:bb:cc: dd :ee:aa |
本文转自 模范生 51CTO博客,原文链接:http://blog.51cto.com/mofansheng/1632293,如需转载请自行联系原作者