【2018.04.26学习笔记】【linux基础知识9.4-9.5】

9.4 sed(上)

sed:是一种文本流编辑器,主要进行过滤匹配并替换的功能。能够完美支持正则表达式,他把当前处理的文本行存储在临时缓冲区(模式空间),然后进行处理,把处理结果输出到屏幕当中,接着再处理下一文本行,直到文件末尾。

命令格式:sed [选项] '模式(命令+表达式)' 文件名

sed 不加选项,p命令会输出打印匹配的行和文件所有行,所以会有重复的行出现。

[root@lgs-01 sed]# sed '/root/ p' passwdtest 
root:x:0:0:root:/root:/bin/bash
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash

-n选项:只输出匹配的行,与打印命令 p 一起使用。

sed -n '/root/ p' test.txt:输出打印包含root的行 。要匹配的关键词在 / /号中,或者其他符号例如 @

[root@lgs-01 sed]# sed -n '/root/ p' passwdtest 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

-r选项:支持扩展表达式,意思是不用对特殊字符进行转义。就与grep的 -E选项类似。

sed -nr '/r+o/ p' test.txt:输出打印匹配 ro 或者 nr(n代表多个) o 的行。+号代表前面单字符有1个或者多个

[root@lgs-01 sed]# sed -nr '/r+o/ p' passwdtest 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

sed -n '2 p' test.txt :输出打印文件的第二行。

[root@lgs-01 sed]# sed -n '2 p' passwdtest 
bin:x:1:1:bin:/bin:/sbin/nologin

sed -n '5,$ p' test.txt :输出打印文件的第5行到尾行。 $ 代表尾行的意思

[root@lgs-01 sed]# sed -n '5,$ p' passwdtest 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash

sed -n '2,6 p' test.txt:输出打印文件的第2到6行。

[root@lgs-01 sed]# sed -n '2,4 p' passwdtest 
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

sed -n '/^a/ p' test.txt:输出打印以a开头的行。^号代表 以后面字符开头

扫描二维码关注公众号,回复: 129070 查看本文章
[root@lgs-01 sed]# sed -n '/^a/ p' passwdtest 
adm:x:3:4:adm:/var/adm:/sbin/nologin
abc:x:1001:1000::/home/abc:/bin/bash
abc:0
abc:y

sed -n '/r*o/ p' test.txt :输出打印匹配o 或者nr(n代表多个) o 的行。*号代表前面单字符有0个或者多个

[root@lgs-01 sed]# sed -n '/r*o/ p' passwdtest 
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash
rooot
rooroot
rorororororororo
rorororororororot
rot

sed -n '/in$/ p' test.txt:输出打印以in结尾的行,$表示以他前面字符结尾的意思。

[root@lgs-01 sed]# sed -n '/in$/ p' passwdtest 
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

sed -n '/r..o/ p' test.txt:输出打印匹配 r..o 的行。 .号表示单个字符,包括空格符。

[root@lgs-01 sed]# sed -n '/r..o/ p' passwdtest 
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
rooot
rorororororororo
rorororororororot
rorororo

-e选项:在一个命令行中 ,执行多个命令动作,命令动作生效一次就直接输出一次结果,然后再执行下一个命令动作。如果命令动作的输出内容有重合,则会重复显示。

sed -e '1 p' -e '/root/ p' -e '/oo*/ p' -n test.txt:

[root@lgs-01 sed]# sed -e '1 p' -e '/root/ p' -e '/oo*/ p' -n passwdtest 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash
rooot
rooroot
rooroot
rorororororororo
rorororororororot
rot
rorororo
oooo
r..o

大 I 命令:不区分大小写

sed -n '/user/ Ip' test.txt :

[root@lgs-01 sed]# sed -n '/user/ Ip' passwdtest 
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin

9.5 sed(下)

d命令:删除匹配的行后显示剩余的行,不删除原文件内容。不用p打印p命令都可以输出打印。

sed '1,36 d' test.txt:删除文件中的第1到36行,输出打印剩余的行。

[root@lgs-01 sed]# sed '1,36 d' passwdtest 
t
t
rorororo
oooo
n
r..o

sed '/nologin/ d' test.txt:删除匹配nologin的行,输出打印剩余的行。

[root@lgs-01 sed]# sed '/nologin/ d' passwdtest 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash

-i选项:直接修改原文件的内容:

sed -i '25,$ d' test.txt :删除文件中的第25行到尾行,直接在原文件中删除。

[root@lgs-01 sed]# sed -i '25,$ d' passwdtest 
[root@lgs-01 sed]# cat passwdtest 
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash
12:22:55
587:1
12:21

s命令:替换指定的字符串

sed '1,10s/root/toor/ g' test.txt :前10行的root 替换成 toor 。g参数代表全局替换,不加g,只替换每行的第一个匹配的字符串。

[root@lgs-01 sed]# sed -n '1,10s/root/toor/ p' passwdtest 
toor:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/toor:/sbin/nologin

[root@lgs-01 sed]# sed -n '1,10s/root/toor/g p' passwdtest 
toor:x:0:0:toor:/toor:/bin/bash
operator:x:11:0:operator:/toor:/sbin/nologin

要被替换的字符串是支持正则表达式的:

sed -r '1,10s/ro+/r/ g' test.txt :前10行的 ro或者 rno(n代表多个) 替换成 r 。

[root@lgs-01 sed]# sed -nr '1,10s/ro+/r/g p' passwdtest 
rt:x:0:0:rt:/rt:/bin/bash
operator:x:11:0:operator:/rt:/sbin/nologin

sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/':以冒号: 为分割,第一段和最后一段对调。\1 \2 \3 代表对应前面的第1、2、3个( )号中内容。

[root@lgs-01 sed]# cat passwdtest 
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash
12:22:55
587:1
12:21

[root@lgs-01 sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' passwdtest 
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:11:0:operator:/root:operator
/sbin/nologin:x:12:100:games:/usr/games:games
/sbin/nologin:x:14:50:FTP User:/var/ftp:ftp
/sbin/nologin:x:99:99:Nobody:/:nobody
/sbin/nologin:x:192:192:systemd Network Management:/:systemd-network
/sbin/nologin:x:81:81:System message bus:/:dbus
/sbin/nologin:x:999:997:User for polkitd:/:polkitd
/sbin/nologin:x:89:89::/var/spool/postfix:postfix
/sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd
/sbin/nologin:x:998:996::/var/lib/chrony:chrony
/bin/bash:x:1008:1000::/home/lgs:lgs
/bin/bash:x:1001:1000::/home/abc:abc
55:22:12
587:1
12:21

sed 's/[a-zA-Z]// g' test.txt:把所有的字母删掉,替换成空。

[root@lgs-01 sed]# sed 's/[a-zA-Z]// g' passwdtest 
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/://
::12:100:://://
::14:50: ://://
::99:99::/://
-::192:192:  :/://
::81:81:  :/://
::999:997:  :/://
::89:89::///://
::74:74:- :///://
::998:996::///://
::1008:1000:://://
::1001:1000:://://
12:22:55
587:1
12:21

sed -r 's/(.*)/aaa:&/' test.txt :在所有行前面加 aaa: 。&号代表 前面( )号匹配的一段字符串,也可以用 \1 表示

[root@lgs-01 sed]# sed -r 's/(.*)/aaa:&/ ' passwdtest 
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
aaa:operator:x:11:0:operator:/root:/sbin/nologin
aaa:games:x:12:100:games:/usr/games:/sbin/nologin
aaa:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
aaa:nobody:x:99:99:Nobody:/:/sbin/nologin
aaa:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
aaa:dbus:x:81:81:System message bus:/:/sbin/nologin
aaa:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
aaa:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
aaa:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
aaa:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
aaa:lgs:x:1008:1000::/home/lgs:/bin/bash
aaa:abc:x:1001:1000::/home/abc:/bin/bash
aaa:12:22:55
aaa:587:1
aaa:12:21

猜你喜欢

转载自my.oschina.net/u/3804114/blog/1801642