正则表达式选项分析
在使用Linux系統的時候我們常常需要對一些文本進行處理,但是有的時候文本特別長,所以我們需要找出我們需要的那些文本。grep命令就可以實現這個功能。
grep系列分為三種,分別是grep,egrep,fgrep,其中egrep和fgrep可以算是grep的衍生版,當grep加上一些特殊命令就變成了egrep和fgrep。這三種命令屬于文本搜索工具,基于給定的文本進行模糊搜索。
grep的全名為Global search REgular expression and Print out the line,中文意思就是利用正則表達式進行全局搜索并將匹配的行顯示出來。這個命令默認工作在貪婪模式下,也就是匹配所有可以匹配的內容,并顯示出匹配到的字符所在行的全部內容。格式為grep [OPTIONS] PATTERN [FILE...]。
OPTIONS為grep的選項,常用選項有:
-i,--ignore:忽略文本字符的大小寫;
?這個功能能夠用在當我們不想區分大小寫的地方,比如:匹配所有以大、小寫s字母
????????~]$?echo?sadSdaaea?|?grep?-i?"s"????匹配結果:sadSdaaea
-v:反向匹配;最終顯示結果是PATTERN不能成功匹配的行;
???????比如:先創建一個包含以下內容的文本文檔“a”~]$?cat?a????????sdzxqw然后使用匹配命令~]$?grep?-v?"s"?a??匹配結果:
????????zx
????????qw
-c --count:匹配PATTERN這個條件的行數;
????????????比如:可以使用上一個選項創建的“a”文件,然后執行命令:~]$?grep?-c?"s"?a? ?匹配結果:
??????1
-o --only matching:關閉貪婪模式,僅顯示能夠匹配的內容;
????當我們在匹配的時候加上了這個選項,那么在顯示匹配結果的時候只會顯示匹配到的內容
????????比如:
????????????????????grep?-o?"s"?a? ?匹配結果:?
??????s
????這個結果匹配到的行應該是sd,但是由于加上了-o選項,所以只顯示一個“s”字母
-q --quiet:安靜模式,不輸出任何匹配結果;
--color=auto:
-E:擴展的正則表達式,grep -E相當于egrep
-F --fixed-strings:grep -F相當于fgrep
-G --basic-regexp:基本的正則表達式?
????egrep -G相當于grep
????fgrep -G相當于grep
-P per1-regexp:使用PCRE引擎;
-A --after-context=NUM:在顯示PATTERN的同時顯示其后面NUM行;
????????創建文件a,包含以下內容????????????]$?cat?adasdaefafaewaagaergaergaergaergaergaergaergaeg?????????]$?cat?a?|grep-A?2?"aa"???匹配結果:
????aa
????gaergaerg
????aerg
????顯示匹配到的內容,并顯示其后頭的兩行
-B --before-context=NUM:在顯示PATTERN的同時顯示其前面NUM行;
?????????]$?cat?a?|grep-B?2?"aa"????efaf
????aew
????aa?
????顯示匹配到的內容,并顯示其前頭的兩行
-C --context=NUM:在顯示PATTERN的同時顯示其前后NUM行;
?????????????????]$?cat?a?|grep?-C?2?"aa"??????匹配結果:??
????????efaf
????????aew
????????aa
????????gaergaerg
????????aerg
????顯示匹配到的內容,并顯示其前頭和后頭的兩行
PATTERN是過濾條件,是由正則表達式的元字符以及沒有特殊含義的文本字符組成。正則表達式的元字符會被正則表達式的引擎解釋為特殊含義。pcre——perl語言的正則表達式引擎是現在公認最完整的引擎。由一些正則表達式的元字符組成。比如:
? 字符匹配:
? ? .:匹配任意單個字符;
????????????]$?cat?a?|grep?"."??????匹配結果:
????????dasda
????????efaf
????????aew
????????aa
????????gaergaerg
????????aerg
????????aergaerg
????????aer
????????ga
????????ergaeg
? ? []:匹配范圍內的任意單個字符;? ?
????????????]$?echo?abcde?|?grep?"[ace]"????匹配結果:
????????abcde
? ? [^]:匹配指定范圍以外的人以單個字符;
??????]$?echo?abcde?|?grep?"[^ace]"????匹配結果:
????????abcde
? 下列所有字符集都可以放于[]中用于匹配單個字符;
? ?[:lower:]:小寫字母
????????????]$?echo?1a2D?|grep?"[[:lower:]]"????匹配結果:
????????1a2D
? ?[:upper:]:大寫字母
????????????]$?echo?1a2D?|grep?"[[:upper:]]"????匹配結果:
????????1a2D
? ?[:alpha:]:所有字母,同于[:lower:]和[:upper:]的組合
????????????]$?echo?1a2D?|grep?"[[:alpha:]]"????匹配結果:
????????1a2D
? ?[:digit:]:數字0-9:0 1 2 3 4 5 6 7 8 9
????????????]$?echo?1a2D?|grep?"[[:digit:]]"????匹配結果:
????????1a2D
? ?[:space:]:空格和制表符
匹配空白和制表符
? ?[:alnum:]:字母與數字,同于[:alpha:]和[:digit:]的組合
????????????]$?echo?1a2D?|grep?"[[:alnum:]]"????匹配結果:
????????1a2D
? ?[:punct:]:特殊字符如:! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` ?~
????????????]$?echo?'1a2D?!@#'?|grep"[[:punct:]]"(因為有特殊字符,所以使用強引用單引號將特殊字符變為普通字符)????匹配結果:
????????1a2D?!@#
? ?[:blank:]:空白
? ?[:xdigit:]:所有的十六進制數字:0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
????????????]$?echo?'1a2D?!@#'?|grep"[[:xdigit:]]"????匹配結果:
????????1a2D?!@#
? ?a-z:所有的小寫字母;
????????????]$?echo?'1a2D?!@#'?|grep?"[a-z]"????匹配結果:
????????1a2D?!@#
? ?A-Z:所有的大寫字母
????????????]$?echo?'1a2D?!@#'?|grep?"[A-Z]"????匹配結果:
????????1a2D?!@#
? ?0-9:標識所有十進制數字;
????????????]$?echo?'1a2D?!@#'?|grep?"[0-9]"????匹配結果:
????????1a2D?!@#
? 次數匹配:該類字符之前的那個字符可以出現的次數;
????????????]$?cat?a?|?grep?"[[:alpha:]]*"????匹配結果:
????????Dasda
?????????
????????Efaf
? ?*:其前面的字符可以出現任意次;(0次,1次或多次)
? ?\?:其前面的字符可有可無(0次或1次)
? ?\+:其前面的字符至少出現一次(1次或多次)
? ?\{m\}:起前面的字符必須出現m次;
????????????]$?echo?"aaaa"?|grep"a\{3\}"????匹配結果:
????????aaaa
? ?\{m,n\}:其前面的字符至少出現m次,至多出現n次;
? ?\{,n\}:其前面的字符至少出現0次,至多出現n次;
? ?\{m,\}:其前面的字符至少出現m次,×××;
? 組合起來的例子:
? ?.*:任意字符出現任意多次
? 位置錨定字符:
? ?行錨定:
? ? 行首錨定:^
????????????]$?cat?adasdaefafaewaagaergaerggaergaeg????????????]$?cat?a?|?grep?"^a"????匹配結果:
????????aew
????????aa
????????匹配以a開頭的行
? ? 行尾錨定:$
????????????]$?cat?a?????????dasdaefafaewaagaergaerggaergaeg????????????]$?cat?a?|?grep?"g$"????匹配結果:
????????gaergaerg
????????ergaeg
? ?字錨定:
? ? 字首錨定:\<或\b
????????????]$?echo?"as?is?da"?|?grep"\<a"????匹配結果:
????????asis da
????????匹配以a字母開頭的字符串
? ? 字尾錨定:\>或\b
? ? \b:舊版本,不建議使用,因為有的時候會出問題,比如說前錨定和后錨定就不好區分
????????????]$?echo?"as?is?da"?|?grep"s\>"????匹配結果:
????????????as is da
????????匹配以s字母結尾的字符串
在有一些情況下,我們可能需要一種例如匹配開頭和結尾一樣的字符串,如果僅僅使用上面的方法很難做到,所以現在有了分組和替換這個好東西。在進行匹配的時候,我們可以將一個前頭匹配到的東西進行標記,然后在后邊進行引用。具體的方法如下:
? ? \(PATTERN\):把PATTERN所匹配到的字符當作一個整體處理
? ? 在一串的匹配元字符中,從左往右數,第幾個“(”所包含的內容就是幾,在后頭可以使用\1,\2,\3...來進行引用。
? ? PATTERN1\(pattern2\)pattern3\(pattern4\(pattern5\)\)
? ? \1:pattern2
? ? \2:pattern4 \(pattern5\)
? ? \3:pattern5
在了解了分類之后,我們就可以使用它來進行實際的操作,例如:找到/etc/passwd中的uid與gid相同的行
????????grep?'\(\<[[:digit:]]\+\>\).*\1'?/etc/passwd在匹配的時候我們還有可能用到或,例如匹配12或34,那么就需要用到“\|”這個符號了,但是請注意,這個符號會把兩邊的字符串當成一個整體,有的時候我們可能想寫分別以大小寫開頭的例如:A\|american,但是這個方法是錯誤的,他會輸出A或american,這個問題可以有兩種方法來解決,一種是(A\|a)merican,第二種是將所有的都寫出來:American\|american
接下來舉個例子:
???請找出ifconfig命令的執行結果中數值在100~255之間的整數;第一位:1????2第二位:0~9??0~4?5第三位:0~9??0~9?0~5答案:
?grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
?默認情況下,grep命令后面只允許有一個pattern,但是有的時候我們需要像或一樣匹配多個我們想匹配的東西,那么此時需要使用-e選項,每個-e選項后頭可以跟一個pattern作為參數。這樣我們就可以同時匹配到不同的東西。為了方便,我們還可以將所需要的pattern寫入到一個文件中,保證每行只有一個pattern,我們就可以使用grep -f file方式來實現多pattern匹配。
egrep和fgrep可以算是grep的衍生版,當grep加上一些特殊命令就變成了egrep和fgrep。egrep就是grep加上-E選項,它的作用就是使后頭的匹配參數不需要轉義即可生效,既可以使用基本的正則表達, 還可以用擴展表達式。而fgrep相當于grep加上-F選項,pattern中所有的字符都被當作文本字符來處理。
轉載于:https://blog.51cto.com/11142243/1917250
總結
- 上一篇: Windows安装TensorFlow
- 下一篇: Android 线性布局(LinearL