grep以及正規表示式

2021-09-20 23:11:16 字數 4009 閱讀 4828

grep:根據模式搜尋文字,並將符合模式的文字行列印出來

-i:忽略大小寫

-v:搜尋不符合模式的文字行

-o:列印完全匹配的字元

--color:匹配的字元高亮

-a num:列印匹配的文字行以及文字的後num行

-b num:列印匹配的文字行以及文字的前num行

-c num:列印匹配的文字行以及文字的前後num行

pattern:由文字字元和正規表示式的元字元組合而成

回顧下檔名匹配規則:

*:匹配任意長度的任意字元

?:匹配任意單個字元

:指定某個範圍內的單個長度字元

[^]:指定某個範圍外的單個長度字元

字元集合:

[:space:]:空字元

[:digit:]:數字

[:lower:]:小寫字母

[:upper:]:大寫字母

[:alpha:]:大小寫字母

[:alnum:]:大小寫字母以及數字集合

正規表示式:regular expression

基本正規表示式:basic

擴充套件正規表示式:extended 命令:egrep,可以使用+,|等元字元

元字元:

.:匹配任意單個字元

:範圍內的單個字元

[^]:範圍外的單個字元

字元集合:

[:space:]:與檔名匹配規則一樣還有[:digit:]....等等

匹配次數(貪婪模式:就是盡可能最大化匹配,比如asabkslbss,我們使用a.*b模式時,它會匹配asabkslb,而不是asab)

*:匹配其前面的字元任意次數

.*:任意長度的任意字元

\?:匹配其前面的字元0次或一次

\:至少匹配m次,至多匹配n次

為什麼使用\轉義等價於 ls -l /etc/passwd /etc/shadow),如果不加轉義的會誤解   

位置錨定:

^:以其後面字元為行首的行

$:以其前面字元為行尾的行

^$:空白行

\《或\b:以其後面字元為詞首的行

\>或\b:以其前面字元為詞尾的行

分組:\(\)

後向引用

\1:引用第1個左括號以及與之對應的右括號所包含的所有內容

\2:引用第2個左括號以及與之對應的右括號所包含的所有內容

\3: ....

regexp中詞的概念:詞與詞之間以特殊字元作為分隔符其他字元視為詞的一部分比如sadjk&jj23342^&這個可以視為兩個詞 sadjk和jj23342

普通正規表示式示例:

假設文字行中包含:a,b,ab,aab,acb,adb,amnb(每個單詞為一行,否則失去意義),請問a*b,a\?b,a.*b,分別匹配哪些文字行

答案:a*b匹配b,ab,aab,但是因為grep是部分匹配所以除了a,其他文字行都會顯示出來,用grep --color可以看到匹配到的字元

a\?b:匹配b和ab,一樣由於部分匹配的原因,除了a,其他的也會顯示

a.*b:匹配ab,aab,acb,adb,amnb。

[root@logstach tmp]# cat test.txt ab

abaab

acbadb

amnb

[root@logstach tmp]# grep a*b test.txt

[root@logstach tmp]# grep 'a*b' test.txtbab

aabacb

adbamnb

[root@logstach tmp]# grep 'a?b' test.txt

[root@logstach tmp]# grep 'a\?b' test.txtbab

aabacb

adbamnb

[root@logstach tmp]# grep 'a.*b' test.txt

abaab

acbadb

amnb

詞首詞尾錨定示例:

[root@logstach tmp]# cat test.txt 

he is a sb

he is a  bigsb

sb250 is him

250sb also is  him

[root@logstach tmp]# grep  'sb\>'  test.txt 

he is a sb

he is a  bigsb

250sb also is  him

[root@logstach tmp]# grep  '\he is a sb

sb250 is him

[root@logstach tmp]# grep  '\'  test.txt 

he is a sb

sb\>錨定以sb作為詞尾的單詞,所以匹配sb、bigsb、250sb,同樣地\\完全錨定sb。

分組後向引用示例:

[root@logstach tmp]# cat test.txt 

he  love his lover.

she like her lover.

he like his liker

she  love  her liker.

假設我們要在上述文字行中找到類似於love ...lover 這種前後對應的行,而不要love...liker這樣額行,我們可以這樣做:

[root@logstach tmp]# grep  '\(l..e\).*\1' test.txt 

he  love his lover.

he like his liker

解析:l..e匹配like和love,括號括起來表示這裡作為乙個分組,.*表示中間跟任意乙個字元,\1表示引用第乙個分組。

擴充套件正規表示式:

字元匹配:.

[^]字符集:

次數匹配:

*:?:

+:匹配其前面的字元至少一次   (相當於)

:m值不能為空    (基本正則也一樣)

位置錨定:^$

\<

\>

分組:():

\1 ,\2 ,\3...

或者|:or

示例:c|cat:表示匹配c或者cat,而不是cat或者cat

[root@logstach tmp]# cat test.txt 

catcat

cchina

cat123

[root@logstach tmp]# egrep 'c|cat' test.txt 

catcat

cchina

cat123

[root@logstach tmp]# egrep '\' test.txt 

catcat

cchina

cat123

[root@logstach tmp]# egrep --color '\<(c|cat)\>' test.txt 

catc

注意:這裡要想完全匹配c|cat,則必須使用分組(),否則\會被認為以c為詞首或者以cat為詞尾的單詞,我們把china變成小寫china,則會被過濾:

[root@logstach tmp]# cat test.txt 

catcat

cchina

cat123

[root@logstach tmp]# egrep --color '\' test.txt 

catcat

ccat123

問題:用egrep過濾出ifconfig顯示的所有可用ip

ipv4:

a:1-127

b:128-191

c:192-223

答案:(不唯一)

ifconfig |egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>)\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'

grep正規表示式

grep的工作方式是這樣的,它在乙個或多個檔案中搜尋字串模板。如果模板包括空格,則必須被引用,模板後的所有字串被看作檔名。搜尋的結果被送到螢幕,不影響原檔案內容。grep可用於shell指令碼,因為grep通過返回乙個狀態值來說明搜尋的狀態,如果模板搜尋成功,則返回0,如果搜尋不成功,則返回1,如果...

Grep正規表示式

grep正規表示式 要用好grep這個工具,其實就是要寫好正規表示式,所以這裡不對grep的所有功能進行例項講解,只列幾個例子,講解乙個正規表示式的寫法。ls l grep a 通過管道過濾ls l輸出的內容,只顯示以a開頭的行。grep test d 顯示所有以d開頭的檔案中包含test的行。gr...

grep正規表示式

文字查詢需要grep global research 根據模式,搜尋文字,並將符合模式的文字行顯示出來。pattern 文字字元和正規表示式的元字元組合而成的匹配條件 man grep 檢視幫助 查詢 etc passwd檔案包含root的內容 root iz233y80y23z grep root...