天天看點

linux指令之grep指令

程式老哥 - 分享知識,不斷成長

linux指令之grep指令

http://www.ksdq8.com/

一、簡介

grep (global search regular expression(RE) and print out the line,全面搜尋正規表達式并把行列印出來)是一種強大的文本搜尋工具,它能使用正規表達式搜尋文本,并把比對的行列印出來。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的指令隻跟grep有很小不同。egrep是grep的擴充,支援更多的re元字元, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正規表達式中的元字元表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F指令行選項來使用egrep和fgrep的功能。

二、grep的格式

grep [options] [--color=auto] '搜尋字元串' filename 選項與參數: -c:隻輸出比對行的計數。

-I:不區分大 小寫(隻适用于單字元)。

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

-l:查詢多檔案時隻輸出包含比對字元的檔案名。

-n:顯示比對行及 行号。

-s:不顯示不存在或無比對文本的錯誤資訊。

-v:顯示不包含比對文本的所有行。

pattern正規表達式主要參數:

\: 忽略正規表達式中特殊字元的原有含義。

^:比對正規表達式的開始行。

$: 比對正規表達式的結束行。

\<:從比對正則表達 式的行開始。

\>:到比對正規表達式的行結束。

[ ]:單個字元,如[A]即A符合要求 。

[ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。

。:所有的單個字元。

* :有字元,長度可以為0。 --color=auto :可以将找到的關鍵詞部分加上顔色的顯示喔!

1、将/etc/passwd,有出現 root 的行取出來

# grep root /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

# cat /etc/passwd | grep root 

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

2、将/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行号

# grep -n root /etc/passwd

1:root:x:0:0:root:/root:/bin/bash

30:operator:x:11:0:operator:/root:/sbin/nologin

grep與正規表達式

 字元類

字元類的搜尋:如果我想要搜尋 test 或 taste 這兩個單字時,可以發現到,其實她們有共通的 't?st' 存在~這個時候,我可以這樣來搜尋:

[[email protected] ~]# grep -n 't[ae]st' regular_express.txt

8:I can't finish the test.

9:Oh! The soup taste good.

其實 [] 裡面不論有幾個位元組,他都僅代表某『一個』位元組, 是以,上面的例子說明了,我需要的字串是『tast』或『test』兩個字串而已!

字元類的反向選擇 [^] :如果想要搜尋到有 oo 的行,但不想要 oo 前面有 g,如下

[[email protected] ~]# grep -n '[^g]oo' regular_express.txt 2:apple is my favorite food. 3:Football game is not use feet only. 18:google is the best tools for search keyword. 19:goooooogle yes!

第 2,3 行沒有疑問,因為 foo 與 Foo 均可被接受!

但是第 18 行明明有 google 的 goo 啊~别忘記了,因為該行後面出現了 tool 的 too 啊!是以該行也被列出來~ 也就是說, 18 行裡面雖然出現了我們所不要的項目 (goo) 但是由於有需要的項目 (too) , 是以,是符合字串搜尋的喔!

至於第 19 行,同樣的,因為 goooooogle 裡面的 oo 前面可能是 o ,例如: go(ooo)oogle ,是以,這一行也是符合需求的!

字元類的連續:再來,假設我 oo 前面不想要有小寫位元組,是以,我可以這樣寫 [^abcd....z]oo , 但是這樣似乎不怎麼友善,由於小寫位元組的 ASCII 上編碼的順序是連續的, 是以,我們可以将之簡化為底下這樣:

[[email protected] ~]# grep -n '[^a-z]oo' regular_express.txt 3:Football game is not use feet only.

也就是說,當我們在一組集合位元組中,如果該位元組組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[A-Z],[0-9]等方式來書寫,那麼如果我們的要求字串是數字與英文呢? 呵呵!就将他此時,就隻剩下第 12 行,因為隻有第 12 行的行首是 the 開頭啊~此外, 如果我想要開頭是小寫位元組的那一行就列出呢?可以這樣:

[[email protected] ~]# grep -n '^[a-z]' regular_express.txt 2:apple is my favorite food. 4:this dress doesn't fit me. 10:motorcycle is cheap than car. 12:the symbol '*' is represented as start. 18:google is the best tools for search keyword. 19:goooooogle yes! 20:go! go! Let's go.全部寫在一起,變成:[a-zA-Z0-9]。

我們要取得有數字的那一行,就這樣:

[[email protected] ~]# grep -n '[0-9]' regular_express.txt 5:However, this dress is about $ 3183 dollars. 15:You are the best is mean you are the no. 1.

行首與行尾位元組 ^ $

行首字元:如果我想要讓 the 隻在行首列出呢? 這個時候就得要使用定位位元組了!我們可以這樣做:

[[email protected] ~]# grep -n '^the' regular_express.txt 12:the symbol '*' is represented as start.

如果我不想要開頭是英文字母,則可以是這樣:

[[email protected] ~]# grep -n '^[^a-zA-Z]' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 21:# I am VBird

3.grep指令使用簡單執行個體

$ grep ‘test’ d*

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

$ grep ‘test’ aa bb cc

顯示在aa,bb,cc檔案中比對test的行。

$ grep ‘[a-z]\{5\}’ aa

顯示所有包含每個字元串至少有5個連續小寫字元的字元串的行。

$ grep ‘w\(es\)t.*\1′ aa

如果west被比對,則es就被存儲到記憶體中,并标記為1,然後搜尋任意個字元(.*),這些字元後面緊跟着 另外一個es(\1),找到就顯示該行。如果用egrep或grep -E,就不用”\”号進行轉義,直接寫成’w(es)t.*\1′就可以了。

歡迎轉載,請注明來源:http://www.16boke.com/article/detail/198

  grep 

繼續閱讀