sed命令
sed工具的用法有很多地方和grep相似,但是grep实现的只是查找而不能替换,sed工具则可以这么操作。
命令格式
sed [options] 'command' file(s)sed [options] -f scriptfile file(s)
选项
-
p : 打印出来,重复相同两行即表示匹配到了结果
-
n : 仅显示script处理后的结果
[root@yolks1 sed]# sed -n '/root/'p test.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin user4:x:1006:1005::/home/user4_creat_by_root:/sbin/nologin
展示一个区间的数据
[root@yolks1 sed]# sed -n '1,$'p test.txt #第1行到结尾,即全部显示 [root@yolks1 sed]# sed -n '1,3'p test.txt #第1行到第3行的数据 [root@yolks1 sed]# cat -n test.txt 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
-
e<script>或--expression=<script> : 以选项中的指定的script来处理输入的文本文件,支持多个行为
[root@yolks1 sed]# sed -e '1'p -e '/bus/'p -n test.txt root:x:0:0:root:/root:/bin/bash dbus:x:81:81:System message bus:/:/sbin/nologin
-
I :将匹配大写和小写都显示出来
[root@yolks1 sed]# sed -n '/nologin/'Ip test.txt 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 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin
正则用法和grep的非常类似,特殊字符也同样可以使用
[root@yolks1 sed]# sed -ne '/^#/'p test.txt #匹配以‘#’开始的 ###skjslopsss [root@yolks1 sed]# sed -ne '/^[0-9]/'p test.txt #匹配以数字开头的 152662272682782728 [root@yolks1 sed]# sed -n '/r.o/'p test.txt #匹配r'任意符号'o的字符 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin user4:x:1006:1005::/home/user4_creat_by_root:/sbin/nologin
-
d :删除某些行 (并不是真正意义上的删除文件行内容,而是仅仅不显示d的内容)
[root@yolks1 sed]# wc -l test.txt 42 test.txt [root@yolks1 sed]# sed '1,40'd test.txt ntp:x:38:38::/etc/ntp:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin [root@yolks1 sed]# wc -l test.txt 42 test.txt
-
i : 配合上面的d选项则可以真正删除
[root@yolks1 sed]# sed -i '1,40'd test.txt [root@yolks1 sed]# wc -l test.txt 2 test.txt
按匹配内容进行删除
[root@yolks1 sed]# sed -i '/ntp/'d test.txt [root@yolks1 sed]# cat -n test.txt 1 tcpdump:x:72:72::/:/sbin/nologin
-
s/被替换的/要替换的/g :替换字符或字符串
[root@yolks1 sed]# sed '1,$s/nologin/loginno/g' test.txt tcpdump:x:72:72::/:/sbin/loginno
可以看到nologin被替换成了loginno,这里s表示替换指定字符,g表示本行全局替换,使用方法和vim里的如出一辙
-
调换两个字符串的位置
[root@yolks1 sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' /sbin/nologin:x:72:72::/:tcpdump [root@yolks1 sed]# sed -r 's/([^:]+):(.*):([^:]+)/\2:\1:\3/' test.txt x:72:72::/:tcpdump:/sbin/nologin
小括号在sed中属于特殊符号,必须在前面加脱义字符“\”或者使用“-r”参数或者还可以使用其他特殊符号替换分隔符 例如#和@,否则无效,上例中用()把想要替换的字符打包成一个整体,替换时写成\3\2\1或\2\3\1。
-
删除文档中的所有数字或者字母 : 原理使用空进行替换
[root@yolks1 sed]# sed 's/[a-zA-Z]//g' test.txt |head ::0:0::/:// ::1:1::/:// ::2:2::/:// 152662272682782728 ### ::3:4:://:// ::4:7::///:// ::5:0::/:// ::6:0::/:// ::7:0::/://
-
给每行前面加固定字符,例如:aaa
[root@yolks1 sed]# head test.txt |sed -r 's/(.*)/aaa:\1/g' aaa:root:x:0:0:root:/root:/bin/bash aaa:bin:x:1:1:bin:/bin:/sbin/nologin aaa:daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN aaa:152662272682782728 aaa:###skjslopsss aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin aaa:sync:x:5:0:sync:/sbin:/bin/sync aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown aaa:halt:x:7:0:halt:/sbin:/sbin/halt