3.13 9.4-9.5聽課筆記
打印、匹配行
[root@localhost sed]# sed '/root/'p test.txt 用sed’匹配特定的字符
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
…
-n 不匹配的行不顯示每行只顯示一次
[root@localhost sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
operatorroooooado:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -n '/r.t/'p test.txt
operatorroooooado:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost sed]# sed -n '/r*t/'p test.txt
root:x:0:0:root:/root:/bin/bash
sh1outdown:x:6:o1o0:s1ohutd1ooown:/sbin:/sbin/shu
halt:x:7:0:halt:/sbin:/sbin/halt
operatorroooooado:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/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
…
[root@localhost sed]# sed -n '/r\+t/'p test.txt 正常使用+需要脫義
[root@localhost sed]# sed -nr '/r+t/'p test.txt 加-r參數則不需要脫義
[root@localhost sed]# sed -nr '/o{2}/'p test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sh1outdown:x:6:o1o0:s1ohutd1ooown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operatorroooooado:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost sed]# sed -nr '/root|bus/'p test.txt 或者
root:x:0:0:root:/root:/bin/bash
operatorroooooado:x:11:0:operator:/root:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost sed]# sed -n '2'p test.txt 打印第2行
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost sed]# sed -n '2,5'p test.txt 打印第2到5行
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
[root@localhost sed]# sed -n '5,$'p test.txt 打印第5行後所有的行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/oaosbin:/bin/sync
sh1outdown:x:6:o1o0:s1ohutd1ooown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost sed]# sed -n '1,$'p test.txt 打印全部內容
[root@localhost sed]# sed -e '1'p -e '/bus/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost sed]# sed -e '1'p -e '/root/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operatorroooooado:x:11:0:operator:/root:/sbin/nologin
*-e一次執行多個項目,若顯示的結果中存在重復的行則會重復顯示
[root@localhost sed]# sed -n '/bus/'Ip test.txt 加I(大寫i)不區分大小寫
dbus:x:81:81:System message bus:/:/sbin/nologin
bus
BUS
Bus
Bus
刪除指定行
案例:
需要刪除一個龐大的日誌文件中前幾個月的內容,只留最後一個月(日誌都含有時間戳)
[root@localhost sed]# egrep -n '#*2018.3.12|#*2018.3.13' aa
1:#######2018.3.12
11:#######2018.3.13
[root@localhost sed]# sed '2,10'd aa
#######2018.3.12
#######2018.3.13
fhuqieh
fdgda
dsgfa
rgqe
adga
*以上命令並沒有直接刪除文件aa中的內容,只是不會顯示2-10行的內容,但對文件本身無任何修改
-I 徹底刪除aa文件中對應的行
[root@localhost sed]# sed -i '2,10'd aa
[root@localhost sed]# cat aa
#######2018.3.12
#######2018.3.13
fhuqieh
fdgda
dsgfa
rgqe
adga
刪除有hyc字段的行
[root@localhost sed]# sed -i '/hyc/'d passwd.bak
[root@localhost sed]# grep 'hyc' passwd.bak
[root@localhost sed]#
替換字符
[root@localhost sed]# sed '1,10s/root/toor/g' passwd.bak
toor:x:0:0:toor:/toor:/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
[root@localhost sed]# sed -r '1,10s/ro+/r/g' passwd.bak |head
rt:x:0:0:rt:/rt:/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:/rt:/sbin/nologin
*寫替換內容時可以使用正則,但需要在sed後加-r選項才能識別正則
[root@localhost sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' bb
/bin/bash:x:0:0:root:/root:root
*將一行最後一個:後的內容與第一個:之前的內容替換
S表示替換行,默認未寫明則替換所有行內容;
每個()內的內容都可以當做一個整體;
為()內的內容從左到右排序1、2、3;
第一個():一個或多個除:外的任意字符;
第二個():任意個任意字符
第三個():同第一個;
貪婪匹配:第二個()的內容表示任意個任意字符,它之後的:匹配的是每一行最後一次出現的:;
前面的([^:]+)在後面需要用\3表示
*/字符過多可能導致系統無法區分可用#或@代替,也可以在/前面加\脫義
刪除文檔中所有的英文字母
[root@localhost sed]# sed 's/[a-zA-Z]//g' bb 用空內容代替字母
::0:0::/://
在所有行的前面加字符串
[root@localhost sed]# sed -r 's/(.*)/aaa&/' bb
aaaroot:x:0:0:root:/root:/bin/bash
aaaoperator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -r 's/(.*)/aaa\1/' bb
aaaroot:x:0:0:root:/root:/bin/bash
aaaoperator:x:11:0:operator:/root:/sbin/nologin
問題:
[root@localhost sed]# sed -r 's/(.*)/aaa\1/' a > a
[root@localhost sed]# cat a
[root@localhost sed]# sed -r 's/(.*)/aaa\1/' a.bak >> a.bak
[root@localhost sed]# cat a.bak
dgdarfagr
aaadgdarfagr
3.13 9.4-9.5聽課筆記