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
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