【2018.04.26學習筆記】【linux基礎知識9.4-9.5】

9.4 sed(上)

sed:是一種文本流編輯器,主要進行過濾匹配並替換的功能。可以完美支持正則表達式,他把當前處理的文本行存儲在臨時緩衝區(模式空間),而後進行處理,把處理結果輸出到屏幕當中,接着再處理下一文本行,直到文件末尾。正則表達式

命令格式:sed [選項] '模式(命令+表達式)' 文件名bash

sed 不加選項,p命令會輸出打印匹配的行和文件全部行,因此會有重複的行出現。ssh

[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的行 。要匹配的關鍵詞在 / /號中,或者其餘符號例如 @post

[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個或者多個code

[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行到尾行。 $ 表明尾行的意思it

[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行。test

[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開頭的行。^號表明 之後面字符開頭

[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 表明對應前面的第一、二、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
相關文章
相關標籤/搜索