语法
$ sed [options] 'command' file(s)
$ sed -f command文件 file(s)
示例
-n 打印相关的行,与p配合使用
选择一行
$ sed -n '10p' passwd
_scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false
$ sed -n '/root/p' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
选择多行
$ nl passwd | sed -n '10,20p'
10 _scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false
11 _ces:*:32:32:Certificate Enrollment Service:/var/empty:/usr/bin/false
12 _appstore:*:33:33:Mac App Store Service:/var/empty:/usr/bin/false
13 _mcxalr:*:54:54:MCX AppLaunch:/var/empty:/usr/bin/false
14 _appleevents:*:55:55:AppleEvents Daemon:/var/empty:/usr/bin/false
15 _geod:*:56:56:Geo Services Daemon:/var/db/geod:/usr/bin/false
16 _serialnumberd:*:58:58:Serial Number Daemon:/var/empty:/usr/bin/false
17 _devdocs:*:59:59:Developer Documentation:/var/empty:/usr/bin/false
18 _sandbox:*:60:60:Seatbelt:/var/empty:/usr/bin/false
19 _mdnsresponder:*:65:65:mDNSResponder:/var/empty:/usr/bin/false
20 _ard:*:67:67:Apple Remote Desktop:/var/empty:/usr/bin/false
$ nl passwd | sed -n '/root/,/Root/p'
2 root:*:0:0:System Administrator:/var/root:/bin/sh
......
53 _cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$ nl passwd | sed -n '/root/,2p'
2 root:*:0:0:System Administrator:/var/root:/bin/sh
3 daemon:*:1:1:System Services:/var/root:/usr/bin/false
53 _cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
取反!
$ nl passwd | sed -n '2!p'
1 nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
3 daemon:*:1:1:System Services:/var/root:/usr/bin/false
间隔
$ nl passwd | sed -n '1~2p'
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
......
a 追加到末尾
$ nl passwd | sed '$a ======================='
......
41 user000:x:1000:1000:user000:/home/user000:/bin/bash
42 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
=======================
#第一行加空格需要加‘\’
$ nl passwd | sed '$a \ =======================\n ======================='
41 user000:x:1000:1000:user000:/home/user000:/bin/bash
42 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
=======================
=======================
i 从末尾插入
$ nl passwd | sed '$i \ ======================='
=======================
42 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
c 替代行,删掉原本的
$ nl passwd | sed '40,42c \ ======================='
39 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
=======================
d 删除行
$ cat tempFile
1
4
6
$ sed '/^$/d' tempFile
1
4
6
s 替换成新的,g全局
$ sed 's/false/true/g' passwd
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/true
#截取IP
$ ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.147.133 netmask 255.255.255.0 broadcast 192.168.147.255
inet6 fe80::99e5:a90b:2e67:92fb prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:2a:d0:a6 txqueuelen 1000 (Ethernet)
RX packets 2961 bytes 264382 (258.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1746 bytes 265407 (259.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ifconfig ens33 | sed -n '/inet /p'
inet 192.168.147.133 netmask 255.255.255.0 broadcast 192.168.147.255
$ ifconfig ens33 | sed -n '/inet /p'| sed -e 's/inet//'
192.168.147.133 netmask 255.255.255.0 broadcast 192.168.147.255
$ ifconfig ens33 | sed -n '/inet /p'| sed -e 's/inet//' -e 's/netmask*.*$//'
192.168.147.133
n 用下一个命令处理,{多个sed命令用;分隔}
$ nl passwd | sed -n '{n;p}'
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
....
$ nl passwd | sed -n '{p;n}'
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
& 代表前面替换的字符串
给用户名加空格:sed 's/^[a-z_-]+/& /' passwd 等同于 sed 's/[a-z_-]+/[a-z_-]+ /' passwd
\u:首字母大写
\U:转换为大写
\l:首字母小写
\L:转换为小写
$ sed 's/^[a-z_-]\+/& /' passwd
root :x:0:0:root:/root:/bin/bash
bin :x:1:1:bin:/bin:/sbin/nologin
daemon :x:2:2:daemon:/sbin:/sbin/nologin
adm :x:3:4:adm:/var/adm:/sbin/nologin
lp :x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync :x:5:0:sync:/sbin:/bin/sync
$ sed 's/^[a-z_-]\+/\u&/' passwd
......
User000:x:1000:1000:user000:/home/user000:/bin/bash
Mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
\( \) 与&不同的是可以只代表部分,/w1(w2)(w3)/\1\2/ :/ w1 (w2) (w3) / \1 \2 / ,\1取的是w2,\2取得是w3
$ ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.147.133 netmask 255.255.255.0 broadcast 192.168.147.255
inet6 fe80::99e5:a90b:2e67:92fb prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:2a:d0:a6 txqueuelen 1000 (Ethernet)
RX packets 1891 bytes 166947 (163.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1140 bytes 157797 (154.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ifconfig ens33 | sed -n '/inet /p'
inet 192.168.147.133 netmask 255.255.255.0 broadcast 192.168.147.255
$ ifconfig ens33 | sed -n '/inet /p' | sed 's/inet \([0-9.]\+\) .*$/\1/'
192.168.147.133
r 读取指定数据插入到匹配行
sed '<放到第几行>r <从哪个文件读数据>' 数据放到哪个文件
$ cat 123.txt
1343536346
12412415
12e412125125
$ cat abc.txt
asdasdasd
asdasdasdasd
asdasdas
#读文件,原文件都没有改变
$ sed '1r 123.txt' abc.txt
asdasdasd
1343536346
12412415
12e412125125
asdasdasdasd
asdasdas
$ cat 123.txt
1343536346
12412415
12e412125125
$ cat abc.txt
asdasdasd
asdasdasdasd
asdasdas
w 从源文件写数据到指定文件
sed '<第几行>w <写到哪个文件>' 源文件
#写文件,会改变被写的文件
$ sed 'w abc.txt' 123.txt
$ cat abc.txt
1343536346
12412415
12e412125125
$ cat 123.txt
1343536346
12412415
12e412125125
q 退出sed
#执行10次就退出
$ nl passwd | sed '10q'
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
#找到nologin的一行后就退出
$ sed '/nologin/q' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
网友评论