轉自:https://www.jb51.net/article/54961.htmlinux
最近一直在研究shell腳本這塊,恰好閒下來整了下本身手頭上比較好的資料中的一些範例,如下是我整理的鳥哥私房菜裏面正則表達式裏面比較基礎的一些語法詳解,適合新手查閱。git
首先先複製一段範例:正則表達式
設置語系爲Cshell
grepexpress
1.搜尋特定字符串"the"
注: n爲顯示行號數組
2.反向搜尋特定字符串"the"app
3.取得任意大小寫"the"的這個字符串tcp
4.利用括號 [] 來搜尋集合字符
搜索test或taste這兩個單詞時,發現他們有共同的't?st',因此能夠這麼搜尋this
這樣其實就是在找t[a]st和t[e]st這兩個分開的字符
若是搜索有 oo 的字符時,則可使用:google
若是搜索oo時不想搜到 oo 前面有 g 的話,咱們能夠利用反向選擇[^]來達成:
若是搜索oo前面不想有小寫字符,則:
注: 大寫英文/小寫英文/數字 可使用 [a-z]/[A-Z]/[0-9]等方式來書寫,也能夠寫在一塊兒
[a-zA-Z0-9]表示要求字符串是數字以及英文
若是咱們要取得有數字的那行,則:
注:但考慮到語系對編碼順序的影響,所以除了連續編碼使用減號[-]外,也能夠用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用
5.顯示行首爲'the'的字符串
顯示行首是小寫字符
6.顯示行尾爲點 . 的那一行
7.顯示5-9行數據
8.顯示空白行
9.找出g??d字符串,起頭g結束d的四個字符串
10. o*表明空字符(就是有沒有字符均可以)或者一個到N個o字符,因此grep -n 'o*' regular_express.txt就會把全部行所有打印出來,
11.oo*表明o+空字符或者一個到N個o字符,因此grep -n 'oo*' regular_express.txt就會把o,oo,ooo等的行所有打印出來
12."goo*g"表明gog,goog,gooog...等
13.找出含g...g字符串的行
注: .表明任意字符, .*則就表明空字符或者一個到N個任意字符
14.找出含有數字的行
或# grep -n '[0-9]' regular_express.txt
15.找出含兩個o的字符串
注:{}由於在shell裏有特殊意義,因此須要加跳脫符\來讓其失去意義
找出g後含2到5個o而後以g結尾的字符串
找出g後含2以上的o而後以g結尾的字符串
總結:
^word 表示帶搜尋的字符串(word)在行首
word$ 表示帶搜尋的字符串(word)在行尾
. 表示1個任意字符
\ 表示轉義字符,在特殊字符前加\會將本來的特殊字符意義去除
* 表示重複0到無窮多個前一個RE(正則表達式)字符
[list] 表示搜索含有list的字符串
[n1-n2] 表示搜索指定的字符串範圍,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的範圍,例如[0-9]表示非數字字符,[A-Z]表示非大寫字符範圍
\{n,m\} 表示找出n到m個前一個RE字符
\{n,\} 表示n個以上的前一個RE字符
egrep總結:
+ 表示重複一個或一個以上的前一個RE字符
範例:egrep 'go+d' regular_express.txt
表示搜尋(god)(good)(goood)...等等字符串,o+表明[一個以上的o]
? 表示重複零個或一個的前一個RE字符
範例:egrep 'go?d' regular_express.txt
表示搜尋(gd)(god)字符串,o?表明[空的或1個o]
注:egrep下'go+d'和'go?d'的結果集合就等於grep下的'go*d'
| 表示用或(or)的方式找出數個字符串
範例:egrep 'gd|good|dog' regular_express.txt
表示搜尋(gd)或(god)或(god)字符串,|表明或
() 表示找出羣組字符串
範例:egrep 'g(la|oo)d' regular_express.txt
表示搜尋(glad)或(good)字符串
() +表示找出多個重複羣組的判別
範例: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
表示搜尋開頭是A結尾是C,中間有一個以上的'xyz'字符串
sed:
插入:
1.將/etc/passwd 的內容列出並打印行號,同時,將2-5行刪除顯示
注: sed是sed -e的簡寫, 後接單引號
同上刪除第2行
同上刪除第三行到最後一行
2.在第二行後加上一行test
在第二行前加上一行test
在第二行後加入兩行test
替換行:
3.將2-5行內容取代爲 No 2-5 number
4 列出/etc/passwd 內第5-7行
替換字符串:
sed 's/被替換字符串/新字符串/g'
1.獲取本機IP的行
將IP前面的部分予以刪除
將IP後面的部分刪除
2.用grep將關鍵詞MAN所在行取出來
刪除批註行
刪除空白行
3.利用sed將regular_express.txt內每一行若爲.的換成!
注:-i參數會直接修改文本,而並不是直接輸出
4.利用sed在文本最後一行加入 #This is a test
注: $表明最後一行 a表明行後添加
將selinux配置文件enforcing改爲disabled
延伸正規表示法:
延伸寫法:
1. +表示重複一個或一個以上的前一個RE字符
例如:egrep -n 'go+d' regular_express.txt
普通寫法: grep -n 'goo*d' regular_express.txt
2. ?表示重複零個或一個前一個RE字符
例如: egrep -n 'go?d' regular_express.txt
3. |表示用或的方式找出數個字符串
例如: egrep -n 'gd|good' regular_express.txt
4. ()表示找出羣組字符串
例如: egrep -n 'g(la|oo)d' regular_express.txt
也就是搜尋(glad)或good這兩個字符串
5. ()+多個重複羣組判別
例如: echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
也就是要找開頭是A結尾是C 中間有一個以上的'xyz'字符串的意思
awk:
1.用last取出登錄數據前五行
取出帳號與登錄者IP,且帳號與IP之間以TAB隔開
注:$1表明用空格或TAB隔開的第一個字段,以此類推。。
$0表明該行所有字段
注: NF表明每一行的$0的字段總數
NR表明目前awk所處的是第幾行數據
FS表明目標分隔符,默認爲空格
2.在/etc/passwd中以:來做爲分段字符,則咱們要查閱第三欄小於10如下的數據,並只列出帳號與第三欄
注:查詢結果未顯示第一行數據,是由於咱們雖然定義了FS=":" 但卻只能在第二行生效
想讀取第一行就須要BEGIN這個關鍵詞:
df:
比較兩個文件的差別:
實例:
1。統計TCP鏈接狀態
過濾出以tcp開頭的行,「^」爲正則表達式用法,以...開頭,這裏是過濾出以tcp開頭的行。S[]定義了一個名叫S的數組,在awk中,數組下標一般從 1 開始,而不是 0。NF當前記錄裏域個數,默認以空格分隔,如上所示的記錄,NF域個數等於$NF表示一行的最後一個域的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是SYN_RECV或TIME_WAIT等。S[$NF]表示數組元素的值,如上所示的記錄,就是S[TIME_WAIT]狀態的鏈接數++S[$NF]表示把某個數加一,如上所示的記錄,就是把S[TIME_WAIT]狀態的鏈接數加一結果就是顯示S數組中最終的數組值例:S[TIME_WAIT]=最終值 S[TESTABLISHED]=最終值ENDfor(key in S)遍歷S[]數組print key,」\t」,S[key]打印數組的鍵和值,中間用\t製表符分割,顯示好一些。