1. 程式人生 > >3.13 9.4-9.5聽課筆記

3.13 9.4-9.5聽課筆記

sed 正則

Sed

打印、匹配行

[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

tdown

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 打印第25

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表示替換行,默認未寫明則替換所有行內容;

每個()內的內容都可以當做一個整體;

為()內的內容從左到右排序123;

第一個():一個或多個除:外的任意字符;

第二個():任意個任意字符

第三個():同第一個;

貪婪匹配:第二個()的內容表示任意個任意字符,它之後的:匹配的是每一行最後一次出現的:;

前面的([^:]+)在後面需要用\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聽課筆記