‘p’ 打印当前行
[root@centos7~]# sed 'p' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
当没有指定条件时,默认会匹配所有的数据行,因此/etc/hosts文件有多少行p指令就被执行多少次,sed读取文件的第1行执行p指令将该行内容显示在屏幕上,接着读取文件的第2行继续执行p指令再将该行内容显示在屏幕上。但是,为什么最终每个数据行却打印显示了两次呢?因为哪怕没有p指令,sed也会默认将读取到的所有数据行显示在屏幕上,所以p指令数据行被打印显示了一次,接着sed默认又将读取的数据行再显示了一次,最终每行显示了两次。可以使用-n选项屏蔽sed默认的输出功能。关闭默认的输出功能后,所有的数据行将仅显示一次。
-n 屏蔽sed的默认输出功能
liweideAir:~ liwei$ sed -n 'p' /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section
liweideAir:~ liwei$
只显示第一行 用1p
liweideAir:~ liwei$ sed -n '1p' /etc/hosts
##
只显示第二行 2p
liweideAir:~ liwei$ sed -n '2p' /etc/hosts
# Host Database
从管道读取数据
liweideAir:~ liwei$ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1s5s1 113Gi 8.2Gi 60Gi 13% 348618 624709360 0% /
devfs 187Ki 187Ki 0Bi 100% 648 0 100% /dev
/dev/disk1s2 113Gi 1.7Gi 60Gi 3% 1902 624709360 0% /System/Volumes/Preboot
/dev/disk1s4 113Gi 20Ki 60Gi 1% 0 624709360 0% /System/Volumes/VM
/dev/disk1s6 113Gi 5.8Mi 60Gi 1% 18 624709360 0% /System/Volumes/Update
/dev/disk1s1 113Gi 42Gi 60Gi 42% 465650 624709360 0% /System/Volumes/Data
map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /System/Volumes/Data/home
liweideAir:~ liwei$ df -h |sed -n '2p'
/dev/disk1s5s1 113Gi 8.2Gi 60Gi 13% 348618 624488040 0% /
liweideAir:~ liwei$
逗号表区间
分号表分隔
刀了表末尾
加好表加几行
波浪线是步长
两斜杠之间匹配 / /
尖角是开头
[root@centos7~]# cat -n /etc/passwd > /tmp/passwd #生产带行号的素材文件
[root@centos7~]# sed -n '1,3p' /tmp/passwd #显示文件的第1到3行
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
[root@centos7~]# sed -n '1p;3p;6p' / tmp/passwd #多条指令使用分号分隔
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@centos7~]# sed -n '2p;8p' /tmp/passwd #显示第2行和第8行
2 bin:x:1:1:bin:/bin:/sbin/nologin
8 halt:x:7:0:halt:/sbin:/sbin/halt
[root@centos7~]# sed -n '3,5p' /tmp/passwd #显示文件的第3到5行
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
[root@centos7~]# sed -n '4, $p' /tmp/passwd #显示第4行到末尾所有行
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
...忽略部分输出内容...
[root@centos7~]# sed -n '3, +3p' /tmp/passwd #显示第3行以及后面的3行
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
[root@centos7~]# sed -n '1~2p' /tmp/passwd #显示1,3,5...奇数行(步长为2)
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
...忽略部分输出内容...
[root@centos7~]# sed -n '2~2p' /tmp/passwd #显示2,4,6...偶数行(步长为2)
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
...忽略部分输出内容...
[root@centos7~]# sed -n '4~2p' /tmp/passwd #显示4,6,8...偶数行(步长为2)
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
[root@centos7~]# cat -n /etc/passwd > /tmp/passwd #生产带行号的素材文件
[root@centos7~]# sed -n '1,3p' /tmp/passwd #显示文件的第1到3行
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
[root@centos7~]# sed -n '1p;3p;6p' / tmp/passwd #多条指令使用分号分隔
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@centos7~]# sed -n '2p;8p' /tmp/passwd #显示第2行和第8行
...忽略部分输出内容...
[root@centos7~]# sed -n '3~2p' /tmp/passwd #显示3,5,7...奇数行(步长为2)
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
...忽略部分输出内容...
[root@centos7~]# sed -n '3~4p' /tmp/passwd #显示3,7,11...(步长为4)
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
11 games:x:12:100:games:/usr/games:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
19 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
...忽略部分输出内容...
[root@centos7~]# sed -n '4~5p' /tmp/passwd #显示4,9,14...(步长为5)
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
19 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@centos7~]# sed -n '$p' /tmp/passwd #显示文件最后一行的内容
19 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@centos7~]# sed -n '/root/p' /tmp/passwd #匹配包含root的行并显示
1 root:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/root:/sbin/nologin
[root@centos7~]# sed -n '/[0-9]/p' /tmp/passwd #匹配包含数字的行并显示
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
...忽略部分输出内容...
[root@centos7~]# sed -n '/^http/p' /etc/services #显示以http开头的数据行
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer
Protocol
http 80/sctp # HyperText Transfer
Protocol
https 443/tcp # http protocol over TLS/SSL
https 443/udp # http protocol over TLS/SSL
https 443/sctp # http protocol over TLS/SSL
...忽略部分输出内容...
-r 开启正则表达式
[root@centos7~]# sed -n '/^(icmp|igmp)/p' /etc/protocols #默认不支持扩展正则
[root@centos7~]# sed -rn '/^(icmp|igmp)/p' /etc/protocols #开启扩展正则功能
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # internet group management protocol
[root@centos7~]# sed -n '\cUIDcp' /etc/login.defs #正则匹配包含UID的行并显示
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
[root@centos7~]# sed -n '\xbashxp' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n '\1bash1p' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n '\:bash:p' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n '\, bash, p' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n 'l' /etc/shells #显示数据内容时打印控制字符
/bin/sh$
/bin/bash$
/sbin/nologin$
/usr/bin/sh$
/usr/bin/bash$
/usr/sbin/nologin$
/bin/tcsh$
/bin/csh$
sed程序使用=指令可以显示行号,结合条件匹配,可以显示特定数据行的行号。
[root@centos7~]# sed -n '/root/=' /etc/passwd #显示包含root字符串的行号
1
10
[root@centos7~]# sed -n '3=' /etc/passwd #显示第3行的行号
3
[root@centos7~]# sed -n '$=' /etc/passwd #显示最后一行的行号
19
在sed中支持使用感叹号(!)对匹配的条件进行取反操作。
[root@centos7~]# sed -n '1! p' /etc/hosts #显示除第1行外的所有行数据
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
[root@centos7~]# sed -n '2! p' /etc/hosts #除第2行外所有内容都显示
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
[root@centos7~]# sed -n '/bash/! p' /etc/shells #除含bash外的所有行都显示
/bin/sh
/sbin/nologin
/usr/bin/sh
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@centos7~]# cp /etc/hosts /tmp/hosts #复制素材文件
[root@centos7~]# sed '1a add test line' /tmp/hosts #第1行后面添加1行数据
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
add test line
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6