Shell正則表達(dá)式之grep、sed、awk實操筆記
最近一直在研究shell腳本這塊,剛好閑下來整了下自己手頭上比較好的資料中的一些范例,以下是我整理的鳥哥私房菜里面正則表達(dá)式里面比較基礎(chǔ)的一些語法詳解,適合新手查閱。
首先先復(fù)制一段范例:
# vi regular_express.txt
-------------------------------
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh!My god!
The gd software is a library for drafting programs.
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird
--------------------------------
設(shè)置語系為C
grep
1.搜尋特定字符串"the"
注: n為顯示行號
2.反向搜尋特定字符串"the"
3.取得任意大小寫"the"的這個字符串
4.利用括號 [] 來搜尋集合字符
搜索test或taste這兩個單詞時,發(fā)現(xiàn)他們有共同的't?st',所以可以這么搜尋
這樣其實就是在找t[a]st和t[e]st這兩個分開的字符
如果搜索有 oo 的字符時,則可以使用:
如果搜索oo時不想搜到 oo 前面有 g 的話,我們可以利用反向選擇[^]來達(dá)成:
如果搜索oo前面不想有小寫字符,則:
注: 大寫英文/小寫英文/數(shù)字 可以使用 [a-z]/[A-Z]/[0-9]等方式來書寫,也可以寫在一起
[a-zA-Z0-9]表示要求字符串是數(shù)字以及英文
如果我們要取得有數(shù)字的那行,則:
注:但考慮到語系對編碼順序的影響,因此除了連續(xù)編碼使用減號[-]外,也可以用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用
# grep -n '[[:digit:]]' regular_express.txt
5.顯示行首為'the'的字符串
顯示行首是小寫字符
6.顯示行尾為點 . 的那一行
7.顯示5-9行數(shù)據(jù)
8.顯示空白行
9.找出g??d字符串,起頭g結(jié)束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.找出含有數(shù)字的行
或# grep -n '[0-9]' regular_express.txt
15.找出含兩個o的字符串
注:{}因為在shell里有特殊意義,所以需要加跳脫符\來讓其失去意義
找出g后含2到5個o然后以g結(jié)尾的字符串
找出g后含2以上的o然后以g結(jié)尾的字符串
總結(jié):
^word 表示帶搜尋的字符串(word)在行首
word$ 表示帶搜尋的字符串(word)在行尾
. 表示1個任意字符
\ 表示轉(zhuǎn)義字符,在特殊字符前加\會將原本的特殊字符意義去除
* 表示重復(fù)0到無窮多個前一個RE(正則表達(dá)式)字符
[list] 表示搜索含有l(wèi)ist的字符串
[n1-n2] 表示搜索指定的字符串范圍,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的范圍,例如[0-9]表示非數(shù)字字符,[A-Z]表示非大寫字符范圍
\{n,m\} 表示找出n到m個前一個RE字符
\{n,\} 表示n個以上的前一個RE字符
egrep總結(jié):
+ 表示重復(fù)一個或一個以上的前一個RE字符
范例:egrep 'go+d' regular_express.txt
表示搜尋(god)(good)(goood)...等等字符串,o+代表[一個以上的o]
? 表示重復(fù)零個或一個的前一個RE字符
范例:egrep 'go?d' regular_express.txt
表示搜尋(gd)(god)字符串,o?代表[空的或1個o]
注:egrep下'go+d'和'go?d'的結(jié)果集合就等于grep下的'go*d'
| 表示用或(or)的方式找出數(shù)個字符串
范例:egrep 'gd|good|dog' regular_express.txt
表示搜尋(gd)或(god)或(god)字符串,|代表或
() 表示找出群組字符串
范例:egrep 'g(la|oo)d' regular_express.txt
表示搜尋(glad)或(good)字符串
() +表示找出多個重復(fù)群組的判別
范例: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
表示搜尋開頭是A結(jié)尾是C,中間有一個以上的'xyz'字符串
sed:
插入:
1.將/etc/passwd 的內(nèi)容列出并打印行號,同時,將2-5行刪除顯示
注: sed是sed -e的簡寫, 后接單引號
同上刪除第2行
同上刪除第三行到最后一行
2.在第二行后加上一行test
在第二行前加上一行test
在第二行后加入兩行test
> test'
替換行:
3.將2-5行內(nèi)容取代為 No 2-5 number
4 列出/etc/passwd 內(nèi)第5-7行
替換字符串:
sed 's/被替換字符串/新字符串/g'
1.獲取本機(jī)IP的行
將IP前面的部分予以刪除
將IP后面的部分刪除
-------------------
192.168.100.74
-------------------
2.用grep將關(guān)鍵詞MAN所在行取出來
刪除批注行
刪除空白行
3.利用sed將regular_express.txt內(nèi)每一行若為.的換成!
注:-i參數(shù)會直接修改文本,而并非直接輸出
4.利用sed在文本最后一行加入 #This is a test
注: $代表最后一行 a代表行后添加
將selinux配置文件enforcing改成disabled
延伸正規(guī)表示法:
延伸寫法:
1. +表示重復(fù)一個或一個以上的前一個RE字符
例如:egrep -n 'go+d' regular_express.txt
普通寫法: grep -n 'goo*d' regular_express.txt
2. ?表示重復(fù)零個或一個前一個RE字符
例如: egrep -n 'go?d' regular_express.txt
3. |表示用或的方式找出數(shù)個字符串
例如: egrep -n 'gd|good' regular_express.txt
4. ()表示找出群組字符串
例如: egrep -n 'g(la|oo)d' regular_express.txt
也就是搜尋(glad)或good這兩個字符串
5. ()+多個重復(fù)群組判別
例如: echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
也就是要找開頭是A結(jié)尾是C 中間有一個以上的'xyz'字符串的意思
awk:
1.用last取出登陸數(shù)據(jù)前五行
取出賬號與登陸者IP,且賬號與IP之間以TAB隔開
注:$1代表用空格或TAB隔開的第一個字段,以此類推。。
$0代表該行全部字段
注: NF代表每一行的$0的字段總數(shù)
NR代表目前awk所處的是第幾行數(shù)據(jù)
FS代表目標(biāo)分隔符,默認(rèn)為空格
2.在/etc/passwd中以:來作為分段字符,則我們要查閱第三欄小于10以下的數(shù)據(jù),并只列出賬號與第三欄
注:查詢結(jié)果未顯示第一行數(shù)據(jù),是因為我們雖然定義了FS=":" 但卻只能在第二行生效
想讀取第一行就需要BEGIN這個關(guān)鍵詞:
df:
比較兩個文件的差異:
-------------------
Only in /etc/rc3.d/: K30spice-vdagentd
Only in /etc/rc5.d/: S70spice-vdagentd
-------------------
實例:
1。統(tǒng)計TCP連接狀態(tài)
/^tcp/
過濾出以tcp開頭的行,“^”為正則表達(dá)式用法,以...開頭,這里是過濾出以tcp開頭的行。
S[]
定義了一個名叫S的數(shù)組,在awk中,數(shù)組下標(biāo)通常從 1 開始,而不是 0。
NF
當(dāng)前記錄里域個數(shù),默認(rèn)以空格分隔,如上所示的記錄,NF域個數(shù)等于
$NF
表示一行的最后一個域的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是SYN_RECV或TIME_WAIT等。
S[$NF]
表示數(shù)組元素的值,如上所示的記錄,就是S[TIME_WAIT]狀態(tài)的連接數(shù)
++S[$NF]
表示把某個數(shù)加一,如上所示的記錄,就是把S[TIME_WAIT]狀態(tài)的連接數(shù)加一
結(jié)果就是顯示S數(shù)組中最終的數(shù)組值
例:S[TIME_WAIT]=最終值 S[TESTABLISHED]=最終值
END
for(key in S)
遍歷S[]數(shù)組
print key,”\t”,S[key]
打印數(shù)組的鍵和值,中間用\t制表符分割,顯示好一些。
PS:關(guān)于正則,本站還提供了2款非常簡便實用的正則表達(dá)式在線工具供大家參考使用:
JavaScript正則表達(dá)式在線測試工具:http://tools.jb51.net/regex/javascript
正則表達(dá)式在線生成工具:http://tools.jb51.net/regex/create_reg
相關(guān)文章
shell腳本ssh遠(yuǎn)程執(zhí)行命令給變量賦值的問題解決
本文主要介紹了shell腳本ssh遠(yuǎn)程執(zhí)行命令給變量賦值的問題解決,就是從A機(jī)器通過SSH方式到B機(jī)器,并執(zhí)行相關(guān)的命令,具有一定的參考價值,感興趣的可以了解一下2023-07-07linux執(zhí)行sh腳本報錯:$’\r’: 未找到命令的完美解決方法
本文給大家介紹linux執(zhí)行sh腳本報錯:$’\r’: 未找到命令的完美解決方法,原因分析及解決辦法給大家講解的非常明白,感興趣的朋友跟隨小編一起看看吧2023-02-02Linux 刪除文件夾和文件的命令(強(qiáng)制刪除包括非空文件)
linux刪除目錄很簡單,很多人還是習(xí)慣用rmdir,不過一旦目錄非空,就陷入深深的苦惱之中,現(xiàn)在使用rm -rf命令即可。接下來通過本文給大家介紹Linux 刪除文件夾和文件的命令(強(qiáng)制刪除包括非空文件),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05