sed命令总结
作者:互联网
目录
我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
个人博客:传送阵
笔者微信:zhanghe15069028807
,非诚勿扰。
1、概述
sed
的作用我们就记得两条就可以了:替换和增删改查,也就是说今后当我们想对文件进行一些文字的替换和增删改查时就要想起sed
。
sed
的语法分成三部分,我们来举一个例子:
//sed <选项-n> <对谁操作,3代表第3行> <干啥p,p代表打印> <要操作的文件>
sed -n 3p /etc/passwd
sed的执行过程:
将文件""吸入""内存,然后在内存里面处理,处理好之后将空间内的内容倾倒到屏幕。
sed常用的选项其实就三个最为常用:
-n:仅显示处理的行
-r:使其支持扩展的正则表达式
-i:sed默认不改变文件的内容,使用-i会改变文件的内容,慎用!
2、查
1、打印整行(一或多)
1、显示文件的哪一行,或是哪几行,要求我们提示知道要显示的东西哪几一行,如果不知道想要的行在文件是第几行,那么可以先用cat -n
或是less -N
进行查看确认,然后再用sed
打印。
//通过这个例子体会`-n`这个选项的作用
[root@zabbix3 tmp]# cat test.txt
zhanghe
zhangjia
zhangwei
[root@zabbix3 tmp]# sed 2p test.txt
zhanghe
zhangjia
zhangjia
zhangwei
[root@zabbix3 tmp]# sed -n 2p test.txt
zhangjia
[root@zabbix3 tmp]# cat test.txt
zhanghe
zhangjia
zhangwei
//仅打印最后一行
[root@zabbix3 tmp]# sed -n '2p' test.txt
zhangjia
//打印最后一行
[root@zabbix3 tmp]# sed -n '$p' test.txt
zhangwei
//下面这两个例子效果是一样的
[root@zabbix3 tmp]# sed -n '2,3p' test.txt
zhangjia
zhangwei
[root@zabbix3 tmp]# sed -n '2,+1p' test.txt
zhangjia
zhangwei
2、正则打印包含关键字的行
2、我们想要显示出现某个关键字的行,比如找出/etc/passwd
当中开头是zhanghe
关键字的行,我们就得使用正则表达式进行匹配,在sed
当中一旦想要使用正则表达式的话就要使用//
这两个符号,在这两上符号内部写正则表达式。
//其实不用sed,通过grep实现这个需求更简单,不是吗?如下所示:
[root@zabbix3 ~]# grep "^zhanghe" /etc/passwd
zhanghe:x:1000:1000::/home/zhanghe:/bin/bash
//下面是这是通过sed实现的,看着还麻烦一点
[root@zabbix3 ~]# sed -n '/^zhanghe/p' /etc/passwd
zhanghe:x:1000:1000::/home/zhanghe:/bin/bash
// 显示结尾是/bin/bash的行,注意转意字符
[root@zabbix3 ~]# grep '/bin/bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
//下面是这是通过sed实现的,看着还麻烦一点
zhanghe:x:1000:1000::/home/zhanghe:/bin/bash
[root@zabbix3 ~]# sed -n '/\/bin\/bash$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhanghe:x:1000:1000::/home/zhanghe:/bin/bash
显示开头是root
或者zhanghe
的行
//“|”符号属于扩展的正则,所以sed加r,grep加e
[root@zabbix3 ~]# egrep '^(root|zhanghe)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhanghe:x:1000:1000::/home/zhanghe:/bin/bash
[root@zabbix3 ~]# sed -rn '/^(root|zhanghe)/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhanghe:x:1000:1000::/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也有类似的选项
//在文本的第3行下面添加两行内容
[root@localhost ~]# sed '3azhanghe\nzhanghe' /etc/passwd zhanghe,zhanghe
//在开头是root的行下面添加两行内容zhanghe,zhanghe
[root@localhost ~]# sed '/^root/azhanghe\nzhanghe' /etc/passwd
//把第一行整体替换成zhanghe,这是替换的一整行
[root@localhost ~]# sed '1czhanghe' /etc/passwd | head -2
zhanghe
bin:x:1:1:bin:/bin:/sbin/nologin
3、删
删除最简单的了,就是使用一个局部命令d就可以了,如下所示:
//删除第一行
sed '1d' /tmp/passwd
//删除1、2、3行
sed '1,3d' /etc/passwd
//删除开头的root的行一直到结尾是nologin的行
sed '/^root/,/nologin$/d' /tmp/passwd
4、改,替换
替换是sed
最重要的功能,也比较简单,我们只需要记住sed替换的标准格式,即:
//s是`sub`的意思,g是`global`就是全局的意思,整体意思就是全局替换。
sed 's@@@g'
[root@localhost tmp]# cat test.txt
zhanghe
zhangmin
zhangjia
zhanghe
zhanghezhanghe
// 不加g,只会替换第一行
[root@localhost tmp]# sed 's@zhanghe@hello@' test.txt
hello
zhangmin
zhangjia
hello
hellozhanghe
//加上g就是全局替换
[root@localhost tmp]# sed 's@zhanghe@hello@g' test.txt
hello
zhangmin
zhangjia
hello
hellohello
其实g所在的位置指代的是哪几代,g是指全部嘛,如果写一个3那就是第三列,也就是说我们可以指定替换哪一列当中的字符串,如下所示,我们替换第三列当中的zhanghe
为hello
:
[root@localhost tmp]# cat test.txt
zhanghe
zhangmin
zhangjia
zhanghe
zhanghezhanghe
zhanghe
//#只有第三列变化了,第一列和第二列的zhanghe都没有被替换
[root@localhost tmp]# sed 's@zhanghe@hello@3' test.txt
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
//取IP
[root@zabbix3 ~]# ifconfig eth0 | sed -n 2p
inet 192.168.80.199 netmask 255.255.255.0 broadcast 192.168.80.255
[root@zabbix3 ~]# ifconfig eth0 | sed -n 2p | sed -r 's@^.*et (.*) net.*@\1@'
192.168.80.199
标签:总结,bin,zhanghe,zabbix3,命令,sed,tmp,root 来源: https://www.cnblogs.com/yizhangheka/p/12026067.html