溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

正則sed/awk的用法

發(fā)布時間:2020-07-28 22:26:15 來源:網(wǎng)絡(luò) 閱讀:485 作者:Asn_Fy 欄目:系統(tǒng)運維

*sed可以實現(xiàn)一些grep的功能,但是稍微麻煩了一些,sed的強項在于刪除文件中的內(nèi)容和替換

sed實現(xiàn)grep檢索功能:

1.根據(jù)關(guān)鍵字檢索:

[root@localhost ~]# sed -n '/root/'p passwd.txt 

*使用sed檢索時需要在關(guān)鍵字前加-n參數(shù),關(guān)鍵字后加p,關(guān)鍵詞還需要用 // 包括起來

2.關(guān)鍵字有特殊符號時加上 -r 參數(shù)或使用脫義符

[root@localhost ~]# sed -nr '/o+t/'p passwd.txt 

3.打印指定行:(打印指定行時直接寫行號即可,不需要加//符號括起來)

[root@localhost ~]# sed -n '5'p passwd.txt 
[root@localhost ~]# sed -n '5,$'p passwd.txt   #打印第五行至最后一行

4.-e 參數(shù):使用多個表達式:

[root@localhost ~]# sed -e '1'p -e '/root/'p -n passwd.txt 

*打印第一行內(nèi)容并檢索包含root的行,如果第一行同時包含root,那么第一行會被打印兩次

5.不區(qū)分大小寫:(加上大寫的i)

[root@localhost ~]# sed -n '/testword/'Ip passwd.txt 

sed刪除功能:

1.刪除打印結(jié)果中指定的行:

[root@localhost ~]# wc -l passwd.txt 
22 passwd.txt
#查看文件行數(shù)

[root@localhost ~]# sed '1,20'd passwd.txt 
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash
#刪除第1-20行,打印剩余的行

[root@localhost ~]# wc -l passwd.txt 
22 passwd.txt
#該操作不會真實刪除文件內(nèi)容,只是刪除打印結(jié)果

2.-i 參數(shù):刪除文件中指定的行(加上 -i參數(shù)后會真實刪除文件內(nèi)容)

[root@localhost ~]# wc -l passwd.txt 
22 passwd.txt
[root@localhost ~]# sed -i '1,20'd passwd.txt 
[root@localhost ~]# wc -l passwd.txt 
2 passwd.txt

*用于在刪除大日志文件內(nèi)容時比較常用

sed替換功能:

1.根據(jù)關(guān)鍵字替換:

[root@localhost ~]# cat passwd.txt 
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed 's/chrony/sed_test/g' passwd.txt 
sed_test:x:998:996::/var/lib/sed_test:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

*格式: 's/ 被替換關(guān)鍵字 / 替換內(nèi)容 /g'

2.特殊符號匹配時加 -r 參數(shù):

[root@localhost ~]# cat passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -r 's/n+y/sed_test/g' passwd.txt 
sed_test:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

3.分段替換位置:

[root@localhost ~]# cat passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/g' passwd.txt 
/sbin/nologin:x:998:996::/var/lib/chronwy:nnnnny
/bin/bash:x:1000:1000::/home/linux01:linux01

*使用冒號分割為3段,將第三段和第一段位置互換

4.配置關(guān)鍵詞為目錄路徑時加上脫義符或使用其他替換符號:

[root@localhost ~]# cat passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed 's/\/bin\/bash/AAAAAAA/g' passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:AAAAAAA

[root@localhost ~]# sed 's#/bin/bash#AAAAAAA#g' passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:AAAAAAA

5.刪除所有字母:

[root@localhost ~]# cat passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed 's/[a-zA-Z]//g' passwd.txt 
::998:996::///://
01::1000:1000:://01://

6.在每行前添加內(nèi)容:

[root@localhost ~]# cat passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -r 's/.*/sed_test:&/g' passwd.txt 
sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

*匹配每行所有內(nèi)容:.*,&符號代表.*的內(nèi)容

7.真實替換文件中的內(nèi)容:-i 參數(shù)(以上6條示例都不會實際更改文件內(nèi)容,只更改替換完成的打印輸出結(jié)果)

[root@localhost ~]# cat passwd.txt 
nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -i 's/.*/sed_test:&/g' passwd.txt 

[root@localhost ~]# cat passwd.txt 
sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

補充:
把每個單詞的第一個小寫字母變大寫:
sed 's/\b[a-z]/\u&/g' filename

把所有小寫變大寫:
sed 's/[a-z]/\u&/g' filename

大寫變小寫:
sed 's/[A-Z]/\l&/g' filename

sed在某一行最后添加一個數(shù)字
sed -r 's/(^a.*)/\1 12/' test
sed -r 's/^a.*/& 12/' test

打印1到100行含某個字符串的行
sed -n '1,100{/abc/p}' 1.txt


*awk相比grep/egrep/sed的功能更加強大,默認支持拓展正則表達式,grep需要加 -E 參數(shù),sed需要加 -r 參數(shù)

1.分割文件內(nèi)容打印指定段數(shù):

[root@localhost ~]# cat test.txt 
zhangsan 100
lisi     92
wangwu   95
user1    88
user2    93
[root@localhost ~]# awk '{print $1}' test.txt 
zhangsan
lisi
wangwu
user1
user2

*默認以空格為分隔符,$指定打印的段數(shù)

2.-F參數(shù):指定分隔符:

[root@localhost ~]# cat passwd.txt 
AAAA:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '{print $3}' passwd.txt 
nnnnny
linux01
#打印多段時用逗號區(qū)分
[root@localhost ~]# awk -F ':' '{print $1,$3}' passwd.txt 
AAAA nnnnny
AAAA linux01
#指定打印結(jié)果中段與段的分割符號
[root@localhost ~]# awk -F ':' '{print $1"-->"$3}' passwd.txt 
AAAA-->nnnnny
AAAA-->linux01

*awk {print $0}表示打印所有,相當于cat

3.awk檢索:(相當于grep)

[root@localhost ~]# cat passwd.txt 
AAAA:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk '/nnn/' passwd.txt 
AAAA:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

4.檢索指定段中包含關(guān)鍵字的行:

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '$1 ~/AAA/' passwd.txt 
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

5.多個表達式組合使用:

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '/linux/ {print $1,$3} /nnn/ {print $2,$3}' passwd.txt 
sed_test nnnnny
AAAA linux01

*打印包含linux關(guān)鍵字的行的第1和第3段,打印包含nnn關(guān)鍵字的第2和第3段

6.檢索多個關(guān)鍵詞的行并指定打印段:

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '/linux|nnn/ {print $1}'  passwd.txt 
ABCD
AAAA

7.通過運算符號檢索:

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '$5==1000' passwd.txt 
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '$5==1000 {print $1}' passwd.txt 
AAAA

8.針對數(shù)字判斷時,不加雙引號,否則判斷條件會被當做字符串而不是數(shù)字(數(shù)字當做字符串判斷時,根據(jù)ASCII碼判斷,998大于1000):

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '$5<1000' passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
#加上雙引號后1000被當做了字符串,而不是數(shù)字
[root@localhost ~]# awk -F ':' '$5<"1000"' passwd.txt 
[root@localhost ~]# 

9.字符串判斷:(判斷字符串時判斷條件加上雙引號)

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '$9!="/sbin/nologin"' passwd.txt 
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

10.兩個字段之間比較和多個條件檢索:

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '$5>$6' passwd.txt  
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

[root@localhost ~]# awk -F ':' '$5>$6 {print $5,$6}' passwd.txt  
998 996

[root@localhost ~]# awk -F ':' '$5>999' passwd.txt  
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '$5>900 && $6<999' passwd.txt  
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

[root@localhost ~]# awk -F ':' '$5>999 || $9=="/sbin/nologin"' passwd.txt  
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

*最后一種字符串判斷除了用==符號還可以用~檢索

11.OFS:指定打印結(jié)果分隔符:

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '{OFS="***"} {print $1,$2,$3}' passwd.txt  
ABCD***sed_test***nnnnny
AAAA***sed_test***linux01

[root@localhost ~]# awk -F ':' '{OFS="***"} $5<1000 {print $1,$2,$3}' passwd.txt  
ABCD***sed_test***nnnnny

12.NR:在每行前面顯示行數(shù):

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '{print NR":" $0}' passwd.txt 
1:ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
2:AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

13.NF:在每行前面顯示段數(shù):

[root@localhost ~]# awk -F ':' '{print NF":" $0}' passwd.txt 
9:ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
9:AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

14.根據(jù)行數(shù)或者段數(shù)顯示指定的行:
1)顯示行號小于2的行:

[root@localhost ~]# awk -F ':' '{print NR":" $0}' passwd.txt 
1:ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
2:AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk 'NR<2' passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

2)顯示前10行并且第一段為AAAA的行:

[root@localhost ~]# awk -F ':' 'NR<10 && $1 ~/AAAA/' passwd.txt 
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

15.=和==的區(qū)別:(==是匹配相等的數(shù)字或字符串,=是賦值)

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ":" '$1=="ABCD"' passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

[root@localhost ~]# awk -F ":" '$1="hello"' passwd.txt 
hello sed_test nnnnny x 998 996  /var/lib/chronwy /sbin/nologin
hello sed_test linux01 x 1000 1000  /home/linux01 /bin/bash

16.求和:

[root@localhost ~]# cat passwd.txt 
ABCD:sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin
AAAA:sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# awk -F ':' '{(tot=tot+$5)}; END {print tot}' passwd.txt 
1998

補充:

. 表示任意1個字符

* a b o 前面的這個字符有0或者多個
abc* ===> ab、abccc

.* 貪婪匹配

? 擴展正則 表示:?前面的字符有0個或1個
a1? ==> a or a1

+ 擴展正則 表示:+前面的字符有1個或多個

| 擴展正則 表示:或者
egrep 'abc|123' 1.txt

[ ] 表示方括號里面的1個字符
[a-zA-Z0-9] 表示所有大小寫字母和數(shù)字
[abc] 表示a或b或c
[a|@] 表示a或|或@
[^] 表示非,取反

^ 表示開頭

$ 表示結(jié)尾

{ } 表示范圍
a{1,5} ===> a或aa或aaa或aaaa或aaaaa
b{3} ===> bbb

( ) 小括號里面的字符看成一個整體
(abc){2} ==》 abcabc
(abc)+ ==>abc或abcabc或abc*n
abc{2} ==> abcc

擴展正則符號: ? + | { } 使用時grep -E 、sed -r

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI