shell腳本之正則表達式

一、基礎正則表達式實例:
元字符總結:
在這裏插入圖片描述
在Linux系統中常見的文件處理工具中grep和sed支持基礎正則表達式。

grep命令選項:

 -i:查找時不區分大小寫;
 -v:查找時反向輸出,如查找不包含某些字符的內容;
 -n:表示查找出結果後顯示行號;

這三個選項可以結合使用,如“-in”,查找時不區分大小寫並顯示行號。
示例①:

[root@localhost ~]# grep -n 'the' test.txt                   #查找test文件中包含字符“the”的行
#可以將選項改爲“-vn”來查找不包含“the”的行。

示例②:

[root@localhost ~]# grep -n "sh[io]rt" test.txt                   #[io]表示匹配 i 或o的顯示出來
#[ ]中無論有幾個字符都僅代表匹配一個字符即可。

示例③:

[root@localhost ~]# grep -n 'oo' test.txt                 #查找包含字符“oo”的行。
[root@localhost ~]# grep -n 'ooo*' test.txt              #查找包含至少兩個o以上的字符串。
[root@localhost ~]# grep -n 'o\{2\}' test.txt             #查找包含兩個“o”的字符串。
 [root@localhost ~]# grep -n 'o\{2,5\}' test.txt          #查找包含2~5個o的字符串。
 [root@localhost ~]# grep -n 'o\{2,\}' test.txt             #查找包含兩個以上“o”的字符串。

示例④:

[root@localhost ~]# grep -n '[^w]oo' test.txt           #查找“oo”前面不是w的字符串。
[root@localhost ~]# grep -n '[^a-z]oo' test.txt          #查找oo前不是小寫字母的行。
[root@localhost ~]# grep -n '[0-9]' test.txt               #查找包含數字的行。
[root@localhost ~]# grep -n '^the' test.txt             #查找以“the”開頭的行。
[root@localhost ~]# grep -n '^[a-z]' test.txt             #查找以小寫字母開頭的行。
[root@localhost ~]# grep -n '^[A-Z]' test.txt            #查找以大寫字母開頭的行。 
[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt       #查找不以字母開頭的行。
#     “^”在[ ] 號外面表示定位行首,也就是以某些內容開頭,若在[ ]內則表示反向選擇。
[root@localhost ~]# grep -n '\.$' test.txt             #查找以 “ .  ” 結尾的行。
[root@localhost ~]# grep -n 'w..d' test.txt             #查找w開頭,中間兩個未知字符,d結尾的行。
[root@localhost ~]# grep -n 'woo*d' test.txt     #查找w開頭d結尾,中間至少包含一個o的字符串。
[root@localhost ~]# grep -n 'w.*d' test.txt        #查找w開頭d結尾,中間的字符可有可無的字符串。
[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt            #查詢任意數字所在行

二、擴展正則表達式
一般來說基礎正則表達式足以我們使用了,但如果想要簡化整個指令,那麼就可以使用擴展正則表達式,如果使用擴展正則表達式,需要使用egrep或awk命令,常見的擴展正則表達式的元字符主要包括如下幾個:
在這裏插入圖片描述
二.sed
語法如下:

[root@localhost ~]# ]sed [-nefr] [動作 ]

選項與參數如下:

n :使用安靜(silent)模式。在一般sed的用法中,所有來自STDIN 的數據一般都會被列出到屏幕上。但如果加上-n參數後,則只有經過sed特殊處理的那一行(或者動作)纔會被列出來。
-e :直接在命令行界面上進行sed的動作編輯;
-f :直接將sed的動作寫在一一個文件內, -f filename 則可以執行filename 內的sed動作;
-r:sed的動作支持的是延伸型正則表達式的語法。(默認是基礎正則表達式語法)
-i:直接修改讀取的文件內容,而不是由屏幕輸出。

案例:

[root@localhost ~]# nl /etc/passwd | sed '2,5'd
\\刪除2到5行內容
[root@localhost ~]# nl /etc/passwd | sed 'asd'
\\在所有後面行加上asd
[root@localhost ~]# nl /etc/passwd | sed '2a da ....\
aaa'
\\增將兩行以上
[root@localhost ~]# nl /etc/passwd | sed '2,5c    ccccccccccccc'
\\第2-5行的內容取代成爲ccccccccc
[root@localhost ~]# nl /etc/passwd | sed -n '5,7p'
\\僅列出5到7行的內容

部分數據的搜尋與取代的功能
sed ‘s/要被取代的字串/新的字串/g’
sed 的“ -i ”選項可以直接修改文件內容,

延伸正則表達式
在這裏插入圖片描述
三.awk
awk是一個強大的工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。
語法如下:

[root@localhost ~]# awk '條 件類型1{動作1}條件類型2{動作2} .. ' filenamne
[root@localhost ~]# last -n 5 | awk '{print $1 "\t" $3}'
\\取出帳號與登陸者的 IP ,且帳號與 IP 之間以 [tab] 隔開

**整個 awk 的處理流程是:

讀入第一行,並將第一行的數據填入 $0, $1, $2… 等變量當中;
依據 “條件類型” 的限制,判斷是否需要進行後面的 “動作”;
做完所有的動作與條件類型;
若還有後續的“行”的數據,則重複上面 1~3 的步驟,直到所有的數據都讀完爲止。
**

[root@localhost ~]# last -n 5 | awk '{print $1 "\t lines: "NR"\t columns: "NF}'
root     lines: 1    columns: 10
root     lines: 2    columns: 10
(unknown     lines: 3    columns: 10
reboot   lines: 4    columns: 11
root     lines: 5    columns: 10
     lines: 6    columns: 0
wtmp     lines: 7    columns: 7
[root@localhost ~]# 
\\在awk內的NR,NF等變量要用大寫,且不需要$!

在這裏插入圖片描述
awk的邏輯運算字符
在這裏插入圖片描述
邏輯運算上面亦即所謂的大於、小於、等於等判斷式上面,習慣上是以“ == ”來表示;
如果是直接給予一個值,例如變量設置時,就直接使用 = 而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章