Linux命令sed详解分享


Linux命令 sed 详解

Linux命令sed详解

1. sed 详解

sed 是一个精简的、非%ignore_a_1%式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出。

sed 的工作方式

逐行读取文件内容存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。原文件内容并没有改变。

语法格式

 sed "pattern command" file 

高频选项

选项可以用来控制 sed 的处理流程。

编号 选项 含义
1 -n 只打印模式匹配的行
2 -e 直接在命令行进行sed编辑,默认选项
3 -f 编辑动作保存在文件中,指定文件执行
4 -r 支持扩展正则表达式
5 -i 直接修改文件内容

本文中所有测试都用如下内容:

 # cat passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:ROOT:/sbin:/sbin/nologin adm:x:3:4:Root:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd: 

测试-n,只显示匹配的行:

 # sed -n '/root/p' passwd root:x:0:0:root:/root:/bin/bash 

测试-e,多个匹配条件:

 # sed -n -e '/root/p' -e '/ROOT/p' passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:ROOT:/sbin:/sbin/nologin 

测试-f,执行指定文件:

 # cat my.sed /root/p /Root/p # sed -n -f my.sed passwd root:x:0:0:root:/root:/bin/bash adm:x:3:4:Root:/var/adm:/sbin/nologin 

测试-r,支持扩展正则:

 # sed -n -r '/root|ROOT/p' passwd # |是扩展正则 root:x:0:0:root:/root:/bin/bash daemon:x:2:2:ROOT:/sbin:/sbin/nologin 

前面的修改都是显示到屏幕,不会修改源文件,我们现在用-i,修改源文件:

 # sed -i 's/bin/BBB/g' passwd # cat passwd root:x:0:0:root:/root:/BBB/bash BBB:x:1:1:BBB:/BBB:/sBBB/nologin daemon:x:2:2:ROOT:/sBBB:/sBBB/nologin adm:x:3:4:Root:/var/adm:/sBBB/nologin lp:x:4:7:lp:/var/spool/lpd: 

2. pattern 详解

sed 是逐行处理文本,拿到一行内容,先进行匹配,如果满足,才执行命令,如果匹配不上,是不会对该行进行处理。

编号 匹配模式 含义
1 4command 匹配到第4行
2 3,5command 从第3行开始,到5行结束
3 3,+2command 从第3行开始,到第6行结束
4 /pattern/command 匹配到pattern的行
5 /pattern1/,/pattern2/command 从匹配到pattern1开始,到匹配到pattern2结束
6 2,/pattern/command 从第二行开始,到匹配pattern结束
7 /pattern/,5command 匹配到pattern开始,到第5行结束

这里面第4种和第5种是我们实际工作中用的最多的,当然,一般这里都是很复杂的正则,这里我就以这两种来演示。

打印所有不能登录的用户:

 # sed -n '//sbin/nologin/p' passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:ROOT:/sbin:/sbin/nologin adm:x:3:4:Root:/var/adm:/sbin/nologin 

寻找以bin开始到以adm结束的行:

 # sed -n '/^bin/,/^adm/p' passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:ROOT:/sbin:/sbin/nologin adm:x:3:4:Root:/var/adm:/sbin/nologin 

3. 编辑命令详解

类别 编辑命令 含义
查询 p 打印
增加 a 行后追加
i 行前追加
r 读入外部文件
w 匹配行写到外部文件
删除 d 删除
修改 s/old/new/ 将行内第一个old换成new
s/old/new/g 将行内第所有old换成new
s/old/new/ig 将行内第所有old换成new,忽略大小写

下面我们来演示上面的编辑命令。

删除所有不能登录的用户:

 # sed -i '//sbin/nologin/d' passwd # cat passwd root:x:0:0:root:/root:/bin/bash lp:x:4:7:lp:/var/spool/lpd: 

我们经常有一种需求,删除配置文件中的注释行和空行,注释行一般都是以#开头,命令如下:

 sed -e '/^#$/d' /etc/my.cnf | sed -e '/^$/d' /etc/my.cnf 

在root用户后增加一行AAAAAAAAA:

 # sed '/^root/a AAAAAAAAA' passwd root:x:0:0:root:/root:/bin/bash AAAAAAAAA bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:ROOT:/sbin:/sbin/nologin adm:x:3:4:Root:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd: 

将所有的root不区分大小写,全部替换成“管理员”:

 # sed 's/root/管理员/ig' passwd 管理员:x:0:0:管理员:/管理员:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:管理员:/sbin:/sbin/nologin adm:x:3:4:管理员:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd: 

&用在替换字符串时,代表被替换的字符串。

我们想把所有的root,不论大小写,都改成原本的root后面追加上ing:

 # sed 's/root/&ing/ig' passwd rooting:x:0:0:rooting:/rooting:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:ROOTing:/sbin:/sbin/nologin adm:x:3:4:Rooting:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd: 

另外需要注意的是,如果匹配模式中使用了变量,建议用双引号。

 OLD=root NEW=123 sed  $NEW/g" passwd 

4. 综合实践

实际项目基本都有配置文件,我们现在利用 sed 统计配置文件各个段有多少条记录。

测试文件内容如下:

  ] #日志文件输出目录和文件名 LogName=error.log #只打印日志等级<=LogLevel的日志到日志文件中 LogLevel=8 #进程相关 ] #worker进程个数 WorkerProcesses=4 #是否按守护进程方式运行 Daemon=1 #处理接收到的消息的线程池中线程数量,不建议超过300 ProcMsgRecvWorkThreadCount=2 ] #监听的端口数量 ListenPortCount=2 ListenPort0=80 ListenPort1=443 #每个worker进程允许的最大连接数 worker_connections=1024 #延迟回收的等待时间 Sock_RecyConnectionWaitTime=80 

我们的思路是:

  1. 找出[]的行,查找出段。
  2. 根据给出的段名,找出该段的所有信息,然后过滤掉注释和空行
  CONF_FILE_NAME=ngx.conf get_segments# 这个函数的功能是找出以[开头,]结尾的行,通过echo返回出去。 	 	# 取出[]的行,然后将删除[] 	` } get_count_in_segment# 这个函数根据段名统计当前段的配置项的数量 	#  $1 是传递过来的段名 	#  把从给定的段到下一个段之间的数据过滤出来。 	#  将过滤出来的数据清除掉空行和注释行 	items` 	 	# 统计数量 	i=0 	$items 	do 		i` 	done 	$i } num=0 # get_segments得到所有的段 do 	num#有多少个段 	cnt#统计当前段的配置项数量 	$cnt" done 

执行结果:

  # ./my.sh 1 Log : 2 2 Proc : 3 3 Net : 5 

5. 总结

sed 主要用于文本行的处理。这里需要重点强调一下,*** sed 中选项和命令不一样哦,大家可以回过去对比一下***

www.dengb.comtruehttp://www.dengb.com/Linuxjc/1425024.htmlTechArticleLinux命令sed详解 Linux命令 sed 详解 1. sed 详解 sed 是一个精简的、非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在…

—-想了解更多的linux相关异常处理怎么解决关注<计算机技术网>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ctvol.com/linuxsystemusage/639627.html

(0)
上一篇 2021年6月24日
下一篇 2021年6月26日

精彩推荐