一、基礎正則表達式實例:
元字符總結:
在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的邏輯運算字符
邏輯運算上面亦即所謂的大於、小於、等於等判斷式上面,習慣上是以“ == ”來表示;
如果是直接給予一個值,例如變量設置時,就直接使用 = 而已。