sed工具
sed可以实现grep的功能,它也支持 . * + ? {} | 等符号,但是要脱意,但是比grep用起来比较麻烦。 [root@localhost sed]# sed -n '/root/'p test.txt(p是打印的意思) root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 照比grep,他要输入更多的字符,这样会降低我们的工作效率,所以,要过滤字符串,我们还是用grep。
sed也可以打印出指定行 [root@localhost sed]# sed -n '5'p test.txt (只输出第5行) (‘’中输入想得到的行数) daemon:x:2:2:daemon:/sbin:/sbin/nologin
也可以得到指定范围的行 [root@localhost sed]# sed -n '2,5'p test.txt(从2行到5行) (如果想得到指定的范围,在两个数字之间要用‘,’隔开) skdjfklsjdgkljdfkjg123165454:geo:444:qwewq11$%^^ bin:x:1:1:bin:/bin:/sbin/NOlogin 2222222:r.o:lgfkdg;lkdfl daemon:x:2:2:daemon:/sbin:/sbin/nologin
如果想从指定行打印到末尾,那就在逗号后面加上'$'符号 [root@localhost sed]# sed -n '25,$'p test.txt (从25行到最后一行) user:x:1000:1000::/home/user:/bin/bash
aming:x:1001:1001::/home/aming:/bin/bash
oooooo apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
如果想打印全部,就输入1,$。意思就是从第一行到最后一行。 [root@localhost sed]# sed -n '1,$'p test.txt
sed -e在sed中做多项工作,比如我们要打印第一行,还要匹配还有bus的那一行 [root@localhost 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 需要注意的是,在每一项任务的任务开始前都要加-e,然后再输入想要执行的任务,不要忘记还有要执行的参数。
如果想要匹配的字符不区分大小写,则要加参数‘I’,I一定要大写,而且要紧接着匹配任务/’符号的后面。 比如,我们要匹配出bus这个字符,而且文件中有大小写 [root@localhost sed]# sed -n '/bus/'Ip test.txt dbus:x:81:81:System message bus:/:/sbin/nologin BUS 这样就匹配出来了
sed出了可以打印和匹配指定的行外,我们也可以删除指定的行 如果我们有一个很大文件,里面是按照时间排的,而我们要删除以前时间的,只保留现在的,我们先可以grep -n来过滤出我们想要删除的时间范围,然后用sed来删除,用法是在要制定任务的后面讲参数d。 比如我们现在确定要删除文件的1~20行 [root@localhost sed]# sed '1,20'd test.txt sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
user:x:1000:1000::/home/user:/bin/bash
aming:x:1001:1001::/home/aming:/bin/bash
oooooo apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 这样就删除了指定的内容,但是它删除的也仅是在屏幕上显示的,真正文件并没有别删除。
如果想要真正的删除内容,则要在sed后面加参数-i 比如,我们要删除test。txt中的前20行文件 [root@localhost sed]# sed -i '1,20'd test.txt 然后我们查询一下 [root@localhost sed]# wc -l test.txt 10 test.txt 我们发现这个文件也只剩10行了
我们不仅可以删除大范围的行,也可以删除指定的行 比如我们要删除user这行 [root@localhost sed]# sed -i '/user/'d test.txt sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
aming:x:1001:1001::/home/aming:/bin/bash
oooooo apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 然后我们发现user这行已经被删除了
sed真正强大是它的替换功能 比如我们要将test.txt中的root替换成toor,然后直接查看并显示行号,我们可以这样做 [root@localhost sed]# sed '1,10s/root/toor/g' test.txt |cat -n 1 toor:x:0:0:toor:/toor:/bin/bash 2 skdjfklsjdgkljdfkjg123165454:geo:444:qwewq11$%^^ 3 bin:x:1:1:bin:/bin:/sbin/NOlogin 4 2222222:r.o:lgfkdg;lkdfl 5 daemon:x:2:2:daemon:/sbin:/sbin/nologin 6 adm:x:3:4:adm:/var/adm:/sbin/nologin 7 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 8 sync:x:5:0:sync:/sbin:/bin/sync 9 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 10 halt:x:7:0:halt:/sbin:/sbin/halt 它的这种用法和vim中的替换有些类似。
sed -r 同时也支持查找和替换的正则表达式,. * {} 【】+等符号都可以识别。 比如我们要将test。txt中的前十行ro+替换成r [root@localhost sed]# sed -r '1,10s/ro+/r/g' test.txt |head rt:x:0:0:rt:/rt:/bin/bash skdjfklsjdgkljdfkjg123165454:geo:444:qwewq11$%^^ bin:x:1:1:bin:/bin:/sbin/NOlogin 2222222:r.o:lgfkdg;lkdfl 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 sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt 这样就将roo替换成了r。
还有一种情况,比如我们要将test.txt的前十行的第一段和最后一段调换一下位置。首先我们要先找到第一段和最后一段,我们可以发现这段内容是用‘:’冒号分割的,所以第一段是([^:]+),而中间我们用贪婪匹配,一直匹配到最后一个‘:’冒号,而最后的内容也是用([^:]+)来匹配的,所以形成这样的命令。还有一点需要注意,如果前面我们用()将前面的内容括起来,那么后面我们就要用\加数字去表示它。这里我们要将后面的内容换到前面,所以我们要将3放到第一位,1放到最后一位。 [root@localhost sed]# head test.txt|sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' /bin/bash:x:0:0:root:/root:root qwewq11$%^^:geo:444:skdjfklsjdgkljdfkjg123165454 /sbin/NOlogin:x:1:1:bin:/bin:bin lgfkdg;lkdfl:r.o:2222222
/sbin/nologin:x:2:2:daemon:/sbin:daemon /sbin/nologin:x:3:4:adm:/var/adm:adm /sbin/nologin:x:4:7:lp:/var/spool/lpd:lp /bin/sync:x:5:0:sync:/sbin:sync /sbin/shutdown:x:6:0:shutdown:/sbin:shutdown /sbin/halt:x:7:0:halt:/sbin:halt 这样第一段和最后一段就替换完成了 *其实也可以用.去替换([^:]+)
比如我们要将test.txt中的前10行的root替换成123 [root@localhost sed]# sed 's@root@123@g' test.txt |head 123:x:0:0:123:/123:/bin/bash skdjfklsjdgkljdfkjg123165454:geo:444:qwewq11$%^^ bin:x:1:1:bin:/bin:/sbin/NOlogin 2222222:r.o:lgfkdg;lkdfl 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 sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
比如,我们要将文案中的字母全部删除,这就意味着我们要将字母全部替换成空 [root@localhost sed]# head test.txt |sed 's@[a-zA-Z]@@g'(a-zA-Z代表字母的范围,包括大小写) ::0:0::/:// 123165454::444:11$%^^ ::1:1::/:// 2222222:.:; ::2:2::/:// ::3:4:://:// ::4:7::///:// ::5:0::/:// ::6:0::/:// ::7:0::/:// 这样就将文件中的字母全部删除了,指正数字和特殊符号了。
比如我们想要在每行的前加上aa:(-r这则扩展表达式) [root@localhost sed]# sed -r 's@(.*)@aa:&@' test.txt |head (其中&表示前面的小括号) aa:root:x:0:0:root:/root:/bin/bash aa:skdjfklsjdgkljdfkjg123165454:geo:444:qwewq11$%^^ aa:bin:x:1:1:bin:/bin:/sbin/NOlogin aa:2222222:r.o:lgfkdg;lkdfl aa:daemon:x:2:2:daemon:/sbin:/sbin/nologin aa:adm:x:3:4:adm:/var/adm:/sbin/nologin aa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin aa:sync:x:5:0:sync:/sbin:/bin/sync aa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown aa:halt:x:7:0:halt:/sbin:/sbin/halt