sed:非交互式编辑器,一次处理一行内容
语法:sed 参数 "[定位 指令]" 文件
参数:
-e 允许多项便捷
-r 扩展正则
-n 取消默认输出(阻止输入行输出)
-i 写入文件,改变了输出流向,修改了源文件
-i.bak修改文件时会创建文件,防止错误修改
-a 指定行后添加内容
-f 指定sed脚本名称
指令:
-p 打印到屏幕
-d 删除
-I 忽略大小写
! 取反
s/// 替换
-e 识别多条指令
-c 将整行内容清楚后替换为c后面指定的内容
!!!指令可以用;号连接
文件内容如下
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20 zx:x:1000:1000:zx:/home/zx:/bin/bash
21 nginx:x:1002:1002::/home/nginx:/sbin/nologin
22 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
23 saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
24 ntp:x:38:38::/etc/ntp:/sbin/nologin
25 mysql:x:1003:1003::/home/mysql:/sbin/nologin
sed -n "/root/p" passwd
1 root:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/root:/sbin/nologin
sed -n "7p" passwd #-n阻止输入行输出
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sed -n "3,9p" passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
sed -n "5p;10p" passwd
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
[root@slave opt]# sed -n "1~2p" passwd #从第一行开始每隔两行删除一行
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
17 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
21 nginx:x:1002:1002::/home/nginx:/sbin/nologin
23 saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
25 mysql:x:1003:1003::/home/mysql:/sbin/nologin
[root@slave opt]# sed -n "0~2p" passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 zx:x:1000:1000:zx:/home/zx:/bin/bash
22 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
24 ntp:x:38:38::/etc/ntp:/sbin/nologin
sed和grep一样,在文件中查找模式时也可以使用正则表达式(RE)和各种元字符,正则表达式是
括在斜杠(/xxx/)的模式,用于查找和替换。
基本元字符集
^ $ . * [ ] [^] \< \> \(\) \{\}
扩展元字符集
? + { } | ()
使用扩展元字符集的方式:
1.转义 如\+等
2. sed -r
1.从第五行开始,往后打印5行,包括第5行
[root@slave opt]# sed -n "5,+5p" passwd
2.打印passwd中开头为root,到开头为sync的行
[root@slave opt]# sed -n '/^root/,/sync/p' /etc/passwd
3.打印passwd中第8行开始,到含有/sbin/nologin的内容的行结束
[root@slave opt]# sed -n "8,/sbin\/nologin/p" passwd
4.查找以root开头的行
[root@slave opt]# sed -n /^root/p /etc/passwd
5.查找以bash结尾的行
[root@slave opt]# sed -n /bash$/p /etc/passwd
6.查找从第一行到首次匹配到/sync/的行
[root@slave opt]# sed -n "1,/^sync/p" passwd
命令 | 含义 |
1d | 删除第一行的内容 |
1,5d | 删除第一行到第5行的内容 |
1,+5d | 删除第一行以及往下5行的内容 |
1d,10d | 删除第一行和第十行的内容 |
1,$d | 删除第一行到最后一行 |
/root/d | 删除匹配到root的行 |
/root/ /sync/d | 删除root和sync中间的所有行 |
/root/,10d | 删除匹配到root的行到第十行的所有内容 |
10,/root/d | 删除第十行直到匹配到root的所有内容 |
1.删除第2行的所有内容
[root@slave opt]# sed "2d" passwd
2.删除第1行到第5行的所有内容
[root@slave opt]# sed "1,5d" passwd
3.删除第2行以及往下6行的内容
[root@slave opt]# sed "2,+6d" passwd
4.删除第一行和第十行的内容
[root@slave opt]# sed "1d;10d" passwd
5.删除匹配到root的所有行
[root@slave opt]# sed "/root/d" passwd
6.删除匹配到sync的行到第10行的所有内容
[root@slave opt]# sed "/sync/,10d" passwd
7.删除匹配到以root开头和以sync开头的行的所有内容
[root@slave opt]# sed "/^root/,/^sync/d" /etc/passwd
删除注释和空白行
sed -r "/^#.*/d";/^$/d 文件
注: 当前的所有操作,只是在模式空间修改,如果真正修改文件, 只需要加 -i 参数
删除时-i和-n不能同时出现
命令 | 含义 |
a | 在行后追加内容 |
i | 在行前追加内容 |
r | 读入外部文件,行后追加 |
w | 将匹配的行写入外部文件 |
源文件内容
111
222
333
444
555
#在第一行后面添加
[root@slave ~]# sed "1ahello" a.txt
111
hello
222
333
444
555
#在第一行和第二行后面添加
[root@slave ~]# sed "1,2ahello" a.txt
111
hello
222
hello
333
444
555
#在最后一行添加
[root@slave ~]# sed '$a hello' a.txt #单引号
111
222
333
444
555
hello
#添加多行内容
[root@slave ~]# sed "1ahello\nworld" a.txt
111
hello
world
222
333
444
555
[root@slave ~]# sed -e "1ahello" -e "1aword" a.txt
111
hello
word
222
333
444
555
#
[root@slave ~]# sed "2ihello" a.txt
111
hello
222
333
444
555
[root@slave ~]# sed "1,2ihello" a.txt
hello
111
hello
222
333
444
555
[root@slave ~]# sed "1ihello\nworld" a.txt
hello
world
111
222
333
444
555
[root@slave ~]# sed -e "1ihello" -e "1iword" a.txt
hello
word
111
222
333
444
555
[root@slave ~]# sed '2r /etc/hosts' a.txt
111
222
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.36.192.66 master1
333
444
555
将/etc/inittab文件内容追加到/etc/passwd文件匹配/bin/sync行的后面
[root@slave ~]#sed '/\/bin\/rsync/r /etc/inittab' /etc/passwd
!!!再次查看a.txtf发现文件并没有被修改(此处的修改只发生在内存的模式空间中,-i覆盖源文件)
[root@slave ~]# cat a.txt
111
222
333
444
555
[root@slave ~]# sed -i "2d" a.txt
[root@slave ~]# sed -i "1ahello" a.txt
[root@slave ~]# cat a.txt
111
hello
333
444
555
为防止误操作,可以再修改文件前先备份-i.back,就会在目录里产生一个备份文件
[root@slave ~]# sed -i.back "1d" a.txt
[root@slave ~]# ll
总用量 68072
-rw-r--r-- 1 root root 485 10月 10 11:51 aliyun.sh
-rw-------. 1 root root 1711 9月 14 11:43 anaconda-ks.cfg
-rw-r--r-- 1 root root 4671 10月 16 10:42 a.sh
-rw-r--r-- 1 root root 18 10月 17 09:18 a.txt
-rw-r--r-- 1 root root 22 10月 17 09:15 a.txt.back
命令 | 含义 |
---|---|
1s/old/new/ | 替换第1行内容old为new |
1,10s/old/new/ | 替换1行到10行的内容old为new |
1,+5s/old/new/ | 替换1行到6行的内容old为new |
文件内容
[root@slave ~]# cat a.txt
111 222 111 aaa
111 aaa
333 222
444 111 111
555 222
[root@slave ~]# sed "s/111/AAA/" a.txt
AAA 222 111 aaa
AAA aaa
333 222
444 AAA 111
555 222
[root@slave ~]# sed "s/111/AAA/g" a.txt
AAA 222 AAA aaa
AAA aaa
333 222
444 AAA AAA
555 222
[root@slave ~]# sed "4s/111/AAA/g" a.txt
111 222 111 aaa
111 aaa
333 222
444 AAA AAA
555 222
[root@slave ~]# sed "1,4s/111/AAA/g" a.txt
AAA 222 AAA aaa
AAA aaa
333 222
444 AAA AAA
555 222
[root@slave ~]# sed "1s/111/AAA/g;5s/222/BBB/" a.txt
AAA 222 AAA aaa
111 aaa
333 222
444 111 111
555 BBB