一、grep
grep鄙麦,(global search regular expression(RE) and print out the line)一個文本過濾工具典唇,作為小白的我常常只用它的最基本的功能,比如說grep root /etc/passwd 來在passwd文件中過濾root關(guān)鍵字胯府〗橄危可是要想脫離小白,就必須要學(xué)它的高級功能了骂因,但是高級功能需要依靠神奇般的正則表達式來完成炎咖,現(xiàn)在先一塊和我看看它的常用用法吧
不帶參數(shù)的用法:
# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
帶參數(shù)的用法:
--color=auto: 對匹配到的文本著色顯色,默認centos7中,grep的別名中乘盼,已經(jīng)將這個選項定義為別名
-v:顯示不被pattern匹配到的行
-i:忽略字符大小寫
-n:顯示匹配的行號
-c:統(tǒng)計匹配的行數(shù)
-o:僅顯示匹配到的字符串
-q:靜默模式升熊,不輸出任何信息(quiet,可以結(jié)合echo $?狀態(tài)碼使用)
-A NUM after, 包含匹配行的后NUM行
-B NUM:before, 包含匹配行的前NUM行
-C NUM context, 包含匹配行的前后各NUM行
-e: 實現(xiàn)多個選項間的邏輯or關(guān)系
-w匹配整個單詞(字母绸栅、下劃線级野、數(shù)字漢字,這幾個連在一起算一個單詞)
-E使用ERE
-F相當于fgrep粹胯,不支持正則表達式
注意1:grep匹配字符時候蓖柔,是按照行來顯示,也就是說风纠,在某一行匹配到字符况鸣,默認是將這一行完整的顯示出來,如果加上-o選項议忽,那么只是將匹配到的顯示出來懒闷。例如:
[root@CentOS7 ~]# grep -o root /etc/passwd
root
root
root
root #在文本中查找到了四個root,每查找到一個顯示到一行
[root@CentOS7 ~]#
注意2:grep -q 是靜默模式查找栈幸,什么叫靜默模式啊愤估,靜默模式就是在文本查找到,不在屏幕上顯示出來速址,我就有疑問了玩焰,不顯示出來,那還要它何用芍锚,不要著急昔园,存在即合理,待我講一講它的細節(jié):
我們知道并炮,shell腳本并不是一門編程語言默刚,他是一個命令解釋器,也就是說是把一堆命令放在一個文件中一塊執(zhí)行的逃魄,這就是shell腳本荤西,那么作為一個重要的命令,grep當然要在shell腳本中插一腳了伍俘,就是說他能在shell腳本中運行邪锌,在shell腳本中運行,則只需要讓機器懂就行了癌瘾,機器懂的只有0和1觅丰,那么靜默模式就有他的用武之地了,如果模板搜索成功妨退,則返回0妇萄,如果搜索不成功蜕企,則返回1,如果搜索的文件不存在嚣伐,則返回2糖赔,這樣,grep也能在shell腳本中大行其道了~
二轩端、egrep
egrep 代表擴展的正則表達式放典,它和正則表達式思想相同,只不過在寫正則表達式時候基茵,省去了一些讓人混亂的"",因為\代表轉(zhuǎn)義奋构,在我們用到比如說“{}”,時候拱层,我們就需要加上\來表示匹配多次弥臼。
三、fgrep
fgrep就是fixed grep或fast grep根灯,它們把所有的字母都看作單詞径缅,也就是說,正則表達式中的元字符表示回其自身的字面意義烙肺,不再特殊纳猪。由于其省去了要匹配的正則表達式,速度比grep ,egrep都要快桃笙。
四氏堤、正則表達式
Regular Expression,正則表達式搏明,簡寫為RegExp
- BRE :Basic RegExp鼠锈,基本正則表達式
- ERE :Extend RegExp ,擴展的正則表達式
- PCRE(Perl Compatible Regular Expressions)
正則表達式有以下知識點星著,只要你將其掌握购笆,你將出身入化,讓我們一塊看看吧
- 字符匹配
- 匹配次數(shù)
- 位置錨定
- 分組與 后向引用
- 或
- 查看正則幫助(man 7 regex)
1.字符匹配:
. 匹配任意單個字符:如r..t
[] 匹配指定范圍內(nèi)的任意單個字符:如[abc]r
[^] 匹配指定范圍外的任意單個字符:如[^abc]r
[:alnum:] 字母和數(shù)字
[:alpha:] 代表任何英文大小寫字符虚循,亦即 A-Z, a-z
[:lower:] 小寫字母
[:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格由桌、刪除、警鈴…)
[:digit:] 十進制數(shù)字 [:xdigit:]十六進制數(shù)字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
2.匹配次數(shù)
* 匹配前面的字符任意次邮丰,包括0次(貪婪模式,盡可能長的匹配)
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次铭乾,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次 #相信聰明的你一定看出來其中的規(guī)律了剪廉,我不多說了
3.位置錨定
^ 行首錨定,用于模式的最左側(cè)(要跟字符匹配里的[^]區(qū)分開炕檩,那個是在中括號里面的)
比如說查找文本中以空格開頭的行可以用如下代碼
grep "^[[:space:]]" file
$ 行尾錨定斗蒋,用于模式的最右側(cè)
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定捌斧,用于單詞模式的左側(cè),表示匹配以..字符開頭的單詞
\> 或 \b 詞尾錨定泉沾;用于單詞模式的右側(cè),表示匹配以..字符結(jié)尾的單詞
\<PATTERN\> 匹配整個單詞
4.分組與后向引用
\(\)將一個或多個字符捆綁在一起捞蚂,當作一個整體進 行處理,
如:\(root\)\+
分組括號中的模式匹配到的內(nèi)容會被正則表達式引擎記錄于 內(nèi)部的變量中跷究,
這些變量的命名方式為: \1, \2, \3, …
\1 表示從左側(cè)起第一個左括號以及與之匹配右括號之間的 模式所匹配到的字符
示例:
\(string1\+\(string2\)*\)
\1 :string1\+\(string2\)*
\2 :string2
后向引用:引用前面的分組括號中的模式所匹配字符姓迅,而非模式本身,
也就是說前面括號里匹配到的是"str1",后向引用的也要找到"str1",才算匹配成功。
grep "\(root\).*\1" /etc/passwd #表示的是查找到root和root之間有任意字符的行俊马。
[root@CentOS7 ~]# grep "\(root\).*\1" /etc/passwd
root:x:0:0:root:/root:/bin/bash
arooter:x:1001:1001::/home/arooter:/bin/bash
5.或
\|
示例:
a\|b: a或b
C\|cat: C或cat
(C\|c)at:Cat或cat
來一個匹配ip地址的示例:
ip a| grep -o '\(\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)'
6.查看幫助man 7 regex
對于能看下去英語的人丁存,絕對實用。對于我這只能自己看懂柴我,不能講出來的人解寝,還是不多說什么了以免誤導(dǎo)
五、擴展的正則表達式
egrep == grep -e
egrep其實很簡單艘儒,就是把grep里的斜線去掉了聋伦,不過有些還沒有去掉。
沒有去掉斜線的有
<, \b :語首
>, \b :語尾