您好,登錄后才能下訂單哦!
上周講了一個非常重要的內容,老師反復叮囑一定要先寫關于這個的博客,那么我們就先講一下文本編輯工具里面的grep系及正則表達式元字符的使用,首先先講一下什么是grep系
grep系:grep、egrep、fgrep
其中最主要的還是grep
grep:Global search Regular Expression and Print out the line
利用正則表達式進行全局查找并將匹配的行顯示出來;
如果想要理解這句話我覺得最好我們先看一下什么是正則表達式的元字符,我們用PATTERN來表示
字符匹配類:
.:表示匹配任意單個字符
例:.abcd就是指的是以任意字符開頭后面是abcd的所有結果比如1abcd等
[]:匹配指定范圍內的任意單個字符
例:配合字符集使用,比如[:lower:]表示的就是匹配小寫字母中的任意一個字母
[^]:匹配指定范圍以外的任意單個字符
這個應該不用舉例,和上一個相反就對了
下列所有的字符集都可以放在中括號里面用于匹配單個字符
[:lower:]:
[:upper:]:
[:alpha:]:
[:digit:]:
[:space:]:
[:alnum:]:
[:punct:]:
[:blank:]:
[:xdigit:]:所有的十六進制數字;
a-z:所有的小寫字符
A-Z:所有的大寫字母
0-9:標識所有的十進制字符
注意:這里的a-z指的就是所有的小寫字母,不再是之前所說的a,A,b,...,z
次數匹配:該類字符之前的那個字符可以出現的次數
*:其前面的字符可以出現任意次(0次、一次、多次)
例:a*bc就表示,bc前面可以出現任意次a,可以是0次,可以是1次,也可以是多次
\?:其前面的字符可有可無(0次或1次)
例:a\?bc就表示,bc前面只可以出現0次或1次a,注意:在?前加轉義字符\是為了防止shell把?當作bash變量來處理,后面的\也是如此
\+:其前面的字符至少出現一次(1次或多次)
例:a\+bc就表示,bc前面至少出現一次a,也可以是多次
\{m\}:其前面的字符必須出現m次
例:a\{m\}bc表示,bc前面必須出現m次a
\{m,n\}:其前面的字符至少出現m次,至多出現n次
例:a\{m,n\}bc表示bc前面最少出現m次a,最多出現n次a
\{,n\}:其前面的字符至多出現n次
例:a\{,n\}bc表示bc前面最多可以出現n次a
\{m,\}:其前面的字符至少出現m次,×××
例:a\{m,\}bc表示bc前面至少出現m次a
在正則表達式中,表示任意長度任意字符的方式:.*
例:.*abc就表示只要是以abc結尾,前面可以是任意長度任意字符的東西
位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
\b:舊版本中的錨定方法,建議不使用
關于行首錨定和字錨定我們在后面的例題中再詳細解釋
在正則表達式中,字是由非特殊字符組成的連續字符串。
分組與引用字符:
\(PATTERN\):將PATTERN匹配到的所有字符當作一個不可分割的整體來處理
分組很好理解,就是把由一串字符組成的東西當作一個整體在計算機中尋找匹配
在正則表達式引擎當中,有一系列的內置變量,這些變量會保存所有分組內的字符信息,用于后向引用,這些變量依次是\1,\2,\3...
PATTERN1\(PATTERN2\)PATTERN3\(PATTERN4\(PATERN5\))
\1:PATTERN2
\2:PATTERN4
\3:PATTERN5
\1:第一組小括號中PATTERN匹配到的字符
\2:第二組小括號中PATTERN匹配到的字符
\3:第三組小括號中PATTERN匹配到的字符
關于引用,最簡單的解釋就是你之前已經使用過的字符串在后面的表達式中如果再用到的話,你可以不打出來,而只用一個符號來代替,第一個出現的就用\1表示,第二個字符就用\2表示,依次類推
例:請找出在/etc/passwd 中用戶的UID和GID相同的用戶賬戶;
首先我們來分析一下,用戶的UID和GID都是一串數字,所有我們想到可以用數字字符集來匹配,然后再來分析用戶的UID和GID一般都是由幾個數字組成,所以我們可以用\+來實現,然后要求GID和UID一樣我們只需表示出GID,直接飲用表示UID就可以了,所以具體的命令格式應該是下面這種格式。
grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd
或:
\|
注意:或字符將其兩邊的字符串當作整體對待;
A\|american:A或american
怎么理解把兩邊的字符串當作整體來對待,就是比如上面這個例子A\|american表示A或american而不是A或a,然后接上merican
我們再來看一個例子:
請找出ifconfig執行結果中數值在100-255之間的整數;
第一位:1 2
第二位:0-9 0-4 5
第三位:0-9 0-9 0-5
這個問題難點不在PATTENR的表示,在于分析這個整數的特點,只要分析明白了,這個問題就很好解決
ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\25[0-5]\)\>'
說完正則表達式的元字符,我們接著來說grep系的具體用法
grep [OPTIONS] PATTERN [FILE...]
PATTERN:過濾條件,是由正則表達式元字符以及沒有特殊含義的文本字符組成
正則表達式的元字符:
會被正則表達式的引擎解釋為特殊含義;
pcre--perl語言的正則表達式引擎;
基本的正則表達式:BRE
擴展的正則表達式:ERE
grep默認僅支持基本正則表達式;
egrep默認支持擴展正則表達式;
fgrep默認不開啟正則表達式引擎;
文本字符:
只具備字符表面含義的那些字符;
常用選項:
-i --ignore-case 忽略文本字符的大小寫
-v --invert-match 反向匹配,最終顯示的結果是PATTERN不能成功匹配的行
-c --count 計數,統計匹配PATTERN的所有行數
-o, --only-matching 關閉貪婪模式,僅顯示PATTERN匹配的內容
-q, --quiet, --silent 安靜模式,不輸出任何匹配結果,用于邏輯判斷
--color[=WHEN], --colour[=WHEN]:將匹配PATTERN的字符以特殊顏色高亮顯示
--color+auto
-E, --extended-regexp 擴展的正則表達式,grep -E相當于egrep
-F, --fixed-strings, --fixed-regexp 基本的正則表達式,egrep -F 相當于fgrep
-G, --basic-regexp:基本的正則表達式 egrep -G相當于grep
-P, --perl-regexp:使用PCRE引擎
-A NUM, --after-context=NUM:在顯示匹配PATTERN的行的同時顯示其后面的NUM行
-B NUM, --before-context=NUM:在顯示匹配PATTERN的行的同時顯示其前面的NUM行
-C NUM, -NUM, --context=NUM:在顯示匹配PATTERN的行的同時顯示其前后的NUM行
關于grep的用法其實和命令的學習是差不多的,就是先記得滾瓜爛熟再配合操作鞏固就好了,接下來說egrep和fgrep就很好理解了,egrep相對于grep的區別就是在使用正則表達式元字符的時候可以不用轉義字符
egrep:
egrep [OPTIONS] PATTERN [FILE...]
擴展的正則表達式元字符:
字符匹配:
.
[]
[^]
次數匹配:
*
?
+
{}
{m,n}
{m,}
{,n}
位置錨定字符
^
$
\<,\b
\>,\b
分組和引用
()
\1,\2,\3
或:
|
fgrep:PATTERN中所有的字符都被當作文本字符來處理
關于fgrep,只是把PATTENR解釋為純文本,不再用正則表達式對其進行解釋,有利用提高搜索的速度
關于grep系和正則表達式元字符就介紹到這,這是很重要的文件處理只是,大家必須好好理解,吸收掌握。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。