sed总结
Posted yizhangheka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed总结相关的知识,希望对你有一定的参考价值。
1、概述
sed的作用我们就记得两条就可以了:替换和增删除改查,也就是说今后当我们想对文件进行一些文字的替换和增删改查时就要想起sed。
sed的语法主要问成三部分,我们来举一个例子:
sed -n 3p /etc/passwd 语法分别是sed <选项-n> <对谁操作,3代表第3行> <干啥p,p代表打印> <要操作的文件>
sed的执行过程:
将文件吸入内存,然后在内存里面处理,处理好之后将空间内的内容倾倒到屏幕。
sed常用的选项其实就三个最为常用:
-n:仅显示处理的行
-r:使其支持扩展的正则表达式
-i:sed默认不改变文件的内容,使用-i会改变文件的内容,慎用!
2、查
1、显示文件的哪一行,或是哪几行,要求我们提示知道要显示的东西哪几一行,如果不知道相要的行在文件当中排名第几,那么可以先用cat -n或是less -N进行查看确认。
[root@localhost test.dir]# sed -n ‘2,3p‘ test.txt #重要要体会加-n和不加n的区别,显示文件的第2行和第3行 钱 370831199305162kjl 孙 39083119920516245X [root@localhost test.dir]# sed -n ‘2,+1p‘ test.txt #与上面的意思是一样的,就是写法不一样。 钱 370831199305162kjl 孙 39083119920516245X [root@localhost ~]# sed -n ‘$p‘ /etc/passwd #查看文件的最后一行 zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash
2、我们想要显示出现某个关键字的行,比如找出/etc/passwd当中包含zhanghe关键字的行,我们就得使用正则表达式进行匹配,在sed当中一旦想要使用正则表达式的话就要使用//这两个符号,在这两上符号内部写正则表达式。
[root@localhost ~]# sed -n ‘/zhanghe/p‘ /etc/passwd zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash [root@localhost ~]# sed -n ‘//bin/bash$/p‘ /etc/passwd #显示结尾是/bin/bash的行,注意转意字符 root:x:0:0:root:/root:/bin/bash zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash
[root@localhost ~]# sed -n ‘/root|zhanghe/p‘ /etc/passwd
#显示文件当中包含root或者zhanghe的行,但是结果什么都没显示?怎么回事?
[root@localhost ~]# sed -nr ‘/root|zhanghe/p‘ /etc/passwd #或者的符号 | 是扩展正则,需要在前面加一个选项r root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash
那么如果我想显示开头是root或者zhanghe的行,应该怎样显示呢?
[root@localhost ~]# sed -nr ‘/^zhanghe|root/p‘ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0: operator:/root:/sbin/nologin zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash
这样写对吗?看结果的第二行,发现第二行的开头并不是root和zhanghe怎么回事呢?其实是因为我们的正则表达式写错了。
‘/^zhanghe|root/‘表示的是开头是zhanghe的行和包含root的行,中间的“|”字符把^zhanghe和root完全隔开了,我们可以使用小括号把zhanghe和root包起括号里面,然后在括号外面加一个行首锚定符,如下所示:
[root@localhost ~]# sed -nr ‘/^(root|zhanghe)/p‘ /etc/passwd root:x:0:0:root:/root:/bin/bash zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash
其实使用正则表达式我们还可以匹配一个范围,比如打印出开头是root行一直到结尾nologin的中间的行,我们还是可以使用正则表达式,如下所示:
[root@localhost ~]# sed -n ‘/^root/,/nologin$/p‘ /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
其实用正则表达式匹配范围非常适合我们用来查看日志,假如说我们查看一下某个时间点到另一个时间点之间发生了什么事情?如下所示:
[root@localhost ~]# sed -n ‘/Oct 21 15:42:48/,/Oct 21 16:09:26/p‘ /var/log/secure
2、增
我们在文本后面增加东西有几种方法呢?vim、nano、>>(echo 、cat)除了这些方法之后,在文本里面增加内容也只有sed了。
通过sed在文本里面增加内容实际上非常的简单,主要就用到三个选项:a/i/c。
a:apped在匹配到的行下面加
i:insert在匹配到的行上面加
c:把这一行内容替换成你想要的内容 #看着是不是有点熟悉,grep也有类似的选项
[root@localhost ~]# sed ‘3azhanghe zhanghe‘ /etc/passwd #在文本的第3行下面添加两行内容zhanghe,zhanghe [root@localhost ~]# sed ‘/^root/azhanghe zhanghe‘ /etc/passwd #在开头是root的行下面添加两行内容zhanghe,zhanghe
[root@localhost ~]# sed ‘/^root/izhanghe zhanghe‘ /etc/passwd | head -4 zhanghe zhanghe root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost ~]# sed ‘2izhanghe zhanghe‘ /etc/passwd | head -4 root:x:0:0:root:/root:/bin/bash zhanghe zhanghe bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# sed ‘1czhanghe‘ /etc/passwd | head -2 #把第一行整体替换成zhanghe,这是替换的一整行 zhanghe bin:x:1:1:bin:/bin:/sbin/nologin
3、删
删除最简单的了,就是使用一个局部命令d就可以了,如下所示:
sed ‘1d‘ /tmp/passwd #删除第一行 sed ‘1,3d‘ /etc/passwd #删除1、2、3行 sed ‘/^root/,/nologin$/d‘ /tmp/passwd #删除开头的root的行一直到结尾是nologin的行
4、改,替换
替换是sed最重要的功能,也比较简单,我们只需要记住sed替换的标准格式,即:
sed ‘s@@@g‘
#s是sub的意思,g是global就是全局的意思,整体意思就是全局替换。
用例子说话吧!
[root@localhost tmp]# cat test.txt zhanghe zhangmin zhangjia zhanghe zhanghezhanghe [root@localhost tmp]# sed ‘s@zhanghe@hello@‘ test.txt #不加g,只会替换第一行 hello zhangmin zhangjia hello hellozhanghe [root@localhost tmp]# sed ‘s@zhanghe@hello@g‘ test.txt #加上g就是全局替换 hello zhangmin zhangjia hello hellohello
其实g所在的位置指代的是哪几代,g是指全部嘛,如果写一个3那就是第三列,也就是说我们可以指定替换哪一列当中的字符串,如下所示,我们替换第三列当中的zhanghe为hello:
[root@localhost tmp]# cat test.txt zhanghe zhangmin zhangjia zhanghe zhanghezhanghe zhanghe [root@localhost tmp]# sed ‘s@zhanghe@hello@3‘ test.txt #只有第三列变化了,第一列和第二列的zhanghe都没有被替换 zhanghe zhangmin zhangjia zhanghe zhanghezhanghe hello #注意,是按照词语进行替换的,我们上面讲的c选项是按行进行替换的。
5、后向引用
所谓的后向引用就是将想要引用的东西用括号包起来,如果再用到的话就可以直接调用了,就是这么简单。
[root@localhost tmp]# echo 123456 | sed -r ‘s@(.*)@1@g‘ #.*就代表所有 123456 [root@localhost tmp]# echo 123456 | sed -r ‘s@1234(.*)@1@g‘ #这个所有指代的就是5和6 56
以上是关于sed总结的主要内容,如果未能解决你的问题,请参考以下文章