一、sed简介
Sed是一款流编辑工具,用来对文本进行过滤与替换操作,特别是当你想要对几十个配置文件做统一修改时,你会感受到Sed的魅力!Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合于处理大数据文件。首先,Sed通过文件或管道读取文件内容,但Sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space),所有的指令操作都是在模式空间中进行的,然后Sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即屏幕上)。Sed的工作流程如下图所示:
二、常用基本语法格式
sed [选项]…{脚本指令} [输入文件]
选项 | 含义 |
---|---|
-n,–quit,–silent | 静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,该选项可以屏蔽自动打印。 |
-e script | 允许多个脚本指令被执行 |
-i,–in-place | 慎用,该选项将直接修改源文件 |
三、常用脚本指令
- a,append表示追加指令
- i,insert表示插入指令
- d,delete表示删除指令
- s,substitution表示替换指令
使用tail -n 10 /var/log//messages >messages.log得到messages.log作为样本数据源,演示sed使用:
[root@slave2 ~]# cat -n messages.log
1 May 4 18:15:55 slave2 systemd: Starting Multi-User System.
2 May 4 18:15:55 slave2 systemd: Starting Update UTMP about System Runlevel Changes...
3 May 4 18:15:55 slave2 systemd: Started Update UTMP about System Runlevel Changes.
4 May 4 18:15:55 slave2 systemd: Startup finished in 1.992s (kernel) + 20.077s (initrd) + 44.664s (userspace) = 1min 6.735s.
5 May 4 18:17:56 slave2 ntpd_intres[653]: host name not found: master
6 May 4 18:21:08 slave2 systemd: Created slice User Slice of root.
7 May 4 18:21:08 slave2 systemd: Starting User Slice of root.
8 May 4 18:21:08 slave2 systemd-logind: New session 1 of user root.
9 May 4 18:21:08 slave2 systemd: Started Session 1 of user root.
10 May 4 18:21:08 slave2 systemd: Starting Session 1 of user root.
3.1.1 匹配打印-p指令
匹配Created打印
[root@slave2 ~]# sed -n -e "/Created/p" messages.log
May 4 18:21:08 slave2 systemd: Created slice User Slice of root.
匹配1-5行打印
[root@slave2 ~]# sed -n -e "1,5p" messages.log
May 4 18:15:55 slave2 systemd: Starting Multi-User System.
May 4 18:15:55 slave2 systemd: Starting Update UTMP about System Runlevel Changes...
May 4 18:15:55 slave2 systemd: Started Update UTMP about System Runlevel Changes.
May 4 18:15:55 slave2 systemd: Startup finished in 1.992s (kernel) + 20.077s (initrd) + 44.664s (userspace) = 1min 6.735s.
May 4 18:17:56 slave2 ntpd_intres[653]: host name not found: master
3.1.2 匹配删除-d指令
匹配删除Created行
[root@slave2 ~]# sed -e "/Created/d" messages.log
May 4 18:15:55 slave2 systemd: Starting Multi-User System.
May 4 18:15:55 slave2 systemd: Starting Update UTMP about System Runlevel Changes...
May 4 18:15:55 slave2 systemd: Started Update UTMP about System Runlevel Changes.
May 4 18:15:55 slave2 systemd: Startup finished in 1.992s (kernel) + 20.077s (initrd) + 44.664s (userspace) = 1min 6.735s.
May 4 18:17:56 slave2 ntpd_intres[653]: host name not found: master
May 4 18:21:08 slave2 systemd: Starting User Slice of root.
May 4 18:21:08 slave2 systemd-logind: New session 1 of user root.
May 4 18:21:08 slave2 systemd: Started Session 1 of user root.
May 4 18:21:08 slave2 systemd: Starting Session 1 of user root
匹配删除1-5行
[root@slave2 ~]# sed -e "1,5d" messages.log
May 4 18:21:08 slave2 systemd: Created slice User Slice of root.
May 4 18:21:08 slave2 systemd: Starting User Slice of root.
May 4 18:21:08 slave2 systemd-logind: New session 1 of user root.
May 4 18:21:08 slave2 systemd: Started Session 1 of user root.
May 4 18:21:08 slave2 systemd: Starting Session 1 of user root.
3.1.3 替换
注意:如果没有g,则对首次出现Starting的字符串有效
[root@slave2 ~]# sed -e '1,10s/Starting/Ending/g' messages.log
May 4 18:15:55 slave2 systemd: Ending Multi-User System.
May 4 18:15:55 slave2 systemd: Ending Update UTMP about System Runlevel Changes...
May 4 18:15:55 slave2 systemd: Started Update UTMP about System Runlevel Changes.
May 4 18:15:55 slave2 systemd: Startup finished in 1.992s (kernel) + 20.077s (initrd) + 44.664s (userspace) = 1min 6.735s.
May 4 18:17:56 slave2 ntpd_intres[653]: host name not found: master
May 4 18:21:08 slave2 systemd: Created slice User Slice of root.
May 4 18:21:08 slave2 systemd: Ending User Slice of root.
May 4 18:21:08 slave2 systemd-logind: New session 1 of user root.
May 4 18:21:08 slave2 systemd: Started Session 1 of user root.
May 4 18:21:08 slave2 systemd: Ending Session 1 of user root.
替换所有html标签对为空:
[root@slave2 ~]# cat test.html
<html>
<head>oill page<\head>
<body><b>This<\b> is <b>oill's<\b> page.</body>
<\html>
[root@slave2 ~]# sed -e 's/<[^>]*>//g' test.html
oill page
This is oill's page.
精确匹配替换:
[root@slave2 ~]# sed -e "s/\<systemd\>/sdfsdf/g" messages.log
May 4 18:15:55 slave2 sdfsdf: Starting Multi-User System.
May 4 18:15:55 slave2 sdfsdf: Starting Update UTMP about System Runlevel Changes...
May 4 18:15:55 slave2 sdfsdf: Started Update UTMP about System Runlevel Changes.
May 4 18:15:55 slave2 sdfsdf: Startup finished in 1.992s (kernel) + 20.077s (initrd) + 44.664s (userspace) = 1min 6.735s.
May 4 18:17:56 slave2 ntpd_intres[653]: host name not found: master
May 4 18:21:08 slave2 sdfsdf: Created slice User Slice of root.
May 4 18:21:08 slave2 sdfsdf: Starting User Slice of root.
May 4 18:21:08 slave2 sdfsdf-logind: New session 1 of user root.
May 4 18:21:08 slave2 sdfsdf: Started Session 1 of user root.
May 4 18:21:08 slave2 sdfsdf: Starting Session 1 of user root.
3.1.4 插入
在第一行之前插入
[root@slave2 ~]# sed -e "1i hello" messages.log
hello
May 4 18:15:55 slave2 systemd: Starting Multi-User System.
May 4 18:15:55 slave2 systemd: Starting Update UTMP about System Runlevel Changes...
May 4 18:15:55 slave2 systemd: Started Update UTMP about System Runlevel Changes.
May 4 18:15:55 slave2 systemd: Startup finished in 1.992s (kernel) + 20.077s (initrd) + 44.664s (userspace) = 1min 6.735s.
May 4 18:17:56 slave2 ntpd_intres[653]: host name not found: master
May 4 18:21:08 slave2 systemd: Created slice User Slice of root.
May 4 18:21:08 slave2 systemd: Starting User Slice of root.
May 4 18:21:08 slave2 systemd-logind: New session 1 of user root.
May 4 18:21:08 slave2 systemd: Started Session 1 of user root.
May 4 18:21:08 slave2 systemd: Starting Session 1 of user root.
在最后一行之后插入:
[root@slave2 ~]# sed -e "1ihello" -e "$ aworld" messages.log
hello
May 4 18:15:55 slave2 systemd: Starting Multi-User System.
May 4 18:15:55 slave2 systemd: Starting Update UTMP about System Runlevel Changes...
May 4 18:15:55 slave2 systemd: Started Update UTMP about System Runlevel Changes.
May 4 18:15:55 slave2 systemd: Startup finished in 1.992s (kernel) + 20.077s (initrd) + 44.664s (userspace) = 1min 6.735s.
May 4 18:17:56 slave2 ntpd_intres[653]: host name not found: master
May 4 18:21:08 slave2 systemd: Created slice User Slice of root.
May 4 18:21:08 slave2 systemd: Starting User Slice of root.
May 4 18:21:08 slave2 systemd-logind: New session 1 of user root.
May 4 18:21:08 slave2 systemd: Started Session 1 of user root.
May 4 18:21:08 slave2 systemd: Starting Session 1 of user root.
world```