grep用法詳解 grep與正規表示式

2021-06-21 23:51:38 字數 4715 閱讀 4486

首先要記住的是: 正規表示式與萬用字元不一樣,它們表示的含義並不相同!

正規表示式只是一種表示法,只要工具支援這種表示法, 那麼該工具就可以處理正規表示式的字串。vim、grep、awk 、sed 都支援正規表示式,也正是因為由於它們支援正則,才顯得它們強大;

1基礎正規表示式

grep 工具,以前介紹過。

grep -[acinv]   '搜尋內容串'   filename

-a 以文字檔案方式搜尋

-c 計算找到的符合行的次數

-i 忽略大小寫

-n 順便輸出行號

-v 反向選擇,即顯示不包含匹配文字的所有行

-h 查詢多檔案時不顯示檔名。

-l 查詢多檔案時只輸出包含匹配字元的檔名。

-s 不顯示不存在或無匹配文字的錯誤資訊。

grep命令加- e引數,這一擴充套件允許使用擴充套件模式匹配。

其中搜尋串可以是正規表示式!

---先用例子說明問題:

以下為整理的grep 正規表示式的大部分功能,詳細參見man 

grep: 要用好grep這個工具,其實就是要寫好正規表示式,所以這裡不對grep的所有功能進行例項講解,只列幾個例子,講解乙個正規表示式的寫法。 

$ ls -l | grep '^a' 通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。 

$ grep 'test' d* 顯示所有以d開頭的檔案中包含test的行。 

$ grep 'test' aa bb cc 顯示在aa,bb,cc檔案中匹配test的行。 

$ grep '[a-z]/' aa 顯示所有包含每個字串至少有5個連續小寫字元的字串的行。 

$ grep 'w/(es/)t.*/1' aa 如果west被匹配,則es就被儲存到記憶體中,並標記為1,然後搜尋任意個字元(.*),這些字元後面緊跟著另外乙個es(/1),找到就顯示該行。如果用egrep或grep -e,就不用"/"號進行轉義,直接寫成'w(es)t.*/1'就可以了。 

grep正規表示式元字符集(基本集) 

^ 錨定行的開始 如:'^grep'匹配所有以grep開頭的行。 

$ 錨定行的結束 如:'grep$'匹配所有以grep結尾的行。 

. 匹配乙個非換行符的字元 如:'gr.p'匹配gr後接乙個任意字元,然後是p。 

* 匹配零個或多個先前字元 如:'*grep'匹配所有乙個或多個空格後緊跟grep的行。 

.*一起用代表任意字元。 

匹配乙個指定範圍內的字元,如'[gg]rep'匹配grep和grep。 

[^] 匹配乙個不在指定範圍內的字元,如:'[^a-fh-z]rep'匹配不包含a-r和t-z的乙個字母開頭,緊跟rep的行。 

/(../) 標記匹配字元,如'/(love/)',love被標記為1。 

/< 錨定單詞的開始,

/> 錨定單詞的結束,如'grep/>'匹配包含以grep結尾的單詞的行。 

x/ 重複字元x,m次,如:'o/'匹配包含5個o的行。 x/ 重複字元x,至少m次,如:'o/'匹配至少有5個o的行。 

x/ 重複字元x,至少m次,不多於n次,如:'o/'匹配5--10個o的行。 

/w 匹配文字和數字字元,也就是[a-za-z0-9_],如:'g/w*p'匹配以g後跟零個或多個文字或數字字元,然後是p。 

/w /w的反置形式,匹配乙個或多個非單詞字元,如點號句號等。 

/b 單詞鎖定符,如: '/bgrep/

b

'只匹配grep。

關於匹配的例項:

grep -c "48" test.txt 統計所有以「48」字元開頭的行有多少

grep -i "may" test.txt 不區分大小寫查詢「may」所有的行)

grep -n "48" test.txt 顯示行號;顯示匹配字元「48」的行及行號,相同於 nl test.txt |grep 48)

grep -v "48" test.txt 顯示輸出沒有字元「48」所有的行)

grep "471" test.txt 顯示輸出字元「471」所在的行)

grep "48;" test.txt 顯示輸出以字元「48」開頭,並在字元「48」後是乙個tab鍵所在的行

grep "48[34]" test.txt 顯示輸出以字元「48」開頭,第三個字元是「3」或是「4」的所有的行)

grep "^[^48]" test.txt 顯示輸出行首不是字元「48」的行)

grep "[mm]ay" test.txt 設定大小寫查詢:顯示輸出第乙個字元以「m」或「m」開頭,以字元「ay」結束的行)

grep "k…d" test.txt 顯示輸出第乙個字元是「k」,第

二、三、四是任意字元,第五個字元是「d」所在的行)

grep "[a-z][9]d" test.txt 顯示輸出第乙個字元的範圍是「a-d」,第二個字元是「9」,第三個字元的是「d」的所有的行

grep "[35]..1998" test.txt 顯示第乙個字元是3或5,第二三個字元是任意,以1998結尾的所有行

grep "4/" test.txt 模式出現機率查詢:顯示輸出字元「4」至少重複出現兩次的所有行

grep "9/" test.txt 模式出現機率查詢:顯示輸出字元「9」至少重複出現三次的所有行

grep "9/" test.txt 模式出現機率查詢:顯示輸出字元「9」重複出現的次數在一定範圍內,重複出現2次或3次所有行

grep -n "^$" test.txt 顯示輸出空行的行號

ls -l |grep "^d" 如果要查詢目錄列表中的目錄 同:ls -d *

ls -l |grep "^d[d]" 在乙個目錄中查詢不包含目錄的所有檔案

ls -l |grpe "^d…..x..x" 查詢其他使用者和使用者組成員有可執行許可權的目錄集合

更多的例子:

1

搜尋有the的行,並輸出行號

$grep -n 'the' regular_express.txt

搜 索沒有the的行,並輸出行號

$grep -nv 'the' regular_express.txt

2利 用搜尋集合字元

表示其中的某乙個字元 ,例如[ade] 表示a或d或e

woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt 

8:i can't finish the test.

9:oh! the soup taste good!

可以用^符號做內的字首,表示除內的字元之外的字 符。

比如搜尋oo前沒有g的字串所在的行. 使用 '[^g]oo' 作搜尋字串

搜尋包含數字的行

woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt 

5:however ,this dress is about $ 3183 dollars.

15:you are the best is menu you are the no.1.

行首與行尾字元 ^ $. ^ 表示行的開頭,$表示行的結尾( 不是字元,是位置)那麼『^$』 就表示空行,因為只有

行首和行尾。

這裡^與裡面使用的^意義不同。它表示^後面的串是在行的開頭。

比如搜尋the在開頭的行

woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt 

12:the symbol '*' is represented as star.

搜尋以小寫字母開頭的行

woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt 

搜尋開頭不是英文本母的行

woody@xiaoc:~/tmp$ grep -n

'^[^a-za-z]' regular_express.txt 

1:"open source" is a good mechanism to develop programs.

21:#i am vbird

woody@xiaoc:~/tmp$ 

$表示它前面的串是在行的結尾,比如 '/.' 表示 . 在一行的結尾

搜尋末尾是.的行

woody@xiaoc:~/tmp$ grep -n 

'/.$' regular_express.txt //. 是正規表示式的特殊符號,所以要用/轉義

注意在ms的系統下生成的文字檔案,換行會加上乙個 ^m 字元。所以最後的字元會是隱藏的^m ,在處理windows

下面的文字時要特別注意!

可以用cat dos_file | tr -d '/r' > unix_file 來刪除^m符號。 ^m==/r

那麼'^$' 就表示只有行首行尾的空行拉!

搜尋空行

woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt 

22:23:

woody@xiaoc:~/tmp$ 

搜尋非空行

woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt 

強大的grep用法詳解 grep與正規表示式

首先要記住的是 正規表示式與萬用字元不一樣,它們表示的含義並不相同 正規表示式只是一種表示法,只要工具支援這種表示法,那麼該工具就可以處理正規表示式的字串。vim grep awk sed 都支援正規表示式,也正是因為由於它們支援正則,才顯得它們強大 在以前上班的公司裡,由於公司是基於web的服務型...

強大的grep用法詳解 grep與正規表示式

from 首先要記住的是 正規表示式與萬用字元不一樣,它們表示的含義並不相同 正規表示式只是一種表示法,只要工具支援這種表示法,那麼該工具就可以處理正規表示式的字串。vim grep awk sed 都支援正規表示式,也正是因為由於它們支援正則,才顯得它們強大 在以前上班的公司裡,由於公司是基於we...

grep用法詳解 grep與正規表示式

首先要記住的是 正規表示式與萬用字元不一樣,它們表示的含義並不相同 正規表示式只是一種表示法,只要工具支援這種表示法,那麼該工具就可以處理正規表示式的字串。vim grep awk sed 都支援正規表示式,也正是因為由於它們支援正則,才顯得它們強大 1基礎正規表示式 grep 工具,以前介紹過。g...