ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sed命令总结

2019-12-11 22:01:52  阅读:276  来源: 互联网

标签:总结 bin zhanghe zabbix3 命令 sed tmp root


目录

我叫张贺,贪财好色。一名合格的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那就是第三列,也就是说我们可以指定替换哪一列当中的字符串,如下所示,我们替换第三列当中的zhanghehello

[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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有