Linux中grep命令學習

2022-05-04 04:39:08 字數 4508 閱讀 4404

grep [-acinv] [--color=auto] '搜尋字串' filename

選項與引數:

-a :將 binary 檔案以 text 檔案的方式搜尋資料

-c :計算找到 '搜尋字串' 的次數

-i :忽略大小寫的不同,所以大小寫視為相同

-n :順便輸出行號

-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!

將/etc/passwd,有出現 root 的行取出來

# grep root /etc/passwd

或# cat /etc/passwd | grep root

將/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行號

# grep -n root /etc/passwd

在關鍵字的顯示方面,grep 可以使用 --color=auto 來將關鍵字部分使用顏色顯示。

將/etc/passwd,將沒有出現 root 和nologin的行取出來

# grep -v root /etc/passwd | grep -v nologin

用 dmesg 列出核心資訊,再以 grep 找出內含 eth 那行,在關鍵字所在行的前兩行與後三行也一起捉出來顯示

# dmesg | grep -n -a3 -b2 --color=auto 'eth'

根據檔案內容遞迴查詢目錄

# grep 『energywise』 *       #在當前目錄搜尋帶'energywise'行的檔案

# grep -r 『energywise』 * #在當前目錄及其子目錄下搜尋'energywise'行的檔案

# grep -l -r 『energywise』 * #在當前目錄及其子目錄下搜尋'energywise'行的檔案,但是不顯示匹配的行,只顯示匹配的檔案

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

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

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

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

# grep -n '[^g]oo' regular_express.txt

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

# grep -n '[^a-z]oo' regular_express.txt

也就是說,當我們在一組集合位元組中,如果該位元組組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[a-z],[0-9]等方式來書寫,那麼如果我們的要求字串是數字與英文呢? 呵呵!就將他全部寫在一起,變成:[a-za-z0-9]。

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

# grep -n '[0-9]' regular_express.txt

行首與行尾位元組 ^ $

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

# grep -n '^the' regular_express.txt

此外, 如果我想要開頭是小寫位元組的那一行就列出呢?可以這樣:

# grep -n '^[a-z]' regular_express.txt

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

# grep -n '^[^a-za-z]' regular_express.txt

^ 符號,在字元類符號(括號)之內與之外是不同的! 在 內代表『反向選擇』,在 之外則代表定位在行首的意義!

那如果我想要找出來,行尾結束為小數點 (.) 的那一行:

# grep -n '\.$' regular_express.txt

特別注意到,因為小數點具有其他意義,所以必須要使用轉義字元(\)來加以解除其特殊意義!

找出空白行:

# grep -n '^$' regular_express.txt

因為只有行首跟行尾 (^$),所以,這樣就可以找出空白行啦!

任意乙個位元組 . 與重複位元組 *

這兩個符號在正規表示式的意義如下:

假設我需要找出 g??d 的字串,亦即共有四個位元組, 起頭是 g 而結束是 d ,我可以這樣做:

# grep -n 'g..d' regular_express.txt

如果我想要列出有 oo, ooo, oooo 等等的資料, 也就是說,至少要有兩個(含) o 以上,該如何是好?

因為 * 代表的是『重複 0 個或多個前面的 re 字元』的意義, 因此,『o*』代表的是:『擁有空位元組或乙個 o 以上的位元組』,因此,『 grep -n 'o*' regular_express.txt 』將會把所有的資料都列印出來終端上!

當我們需要『至少兩個 o 以上的字串』時,就需要 ooo* ,亦即是:

# grep -n 'ooo*' regular_express.txt

如果我想要字串開頭與結尾都是 g,但是兩個 g 之間僅能存在至少乙個 o ,亦即是 gog, goog, gooog.... 等等,那該如何?

# grep -n 'goo*g' regular_express.txt

如果我想要找出 g 開頭與 g 結尾的行,當中的字元可有可無

# grep -n 'g.*g' regular_express.txt

如果我想要找出『任意數字』的行?因為僅有數字,所以就成為:

# grep -n '[0-9][0-9]*' regular_express.txt

限定連續 re 字元範圍 {}.

我們可以利用 . 與 re 字元及 * 來配置 0 個到無限多個重複位元組, 那如果我想要限制乙個範圍區間內的重複位元組數呢?

我想要找出兩個到五個 o 的連續字串,該如何作?這時候就得要使用到限定範圍的字元 {} 了。 但因為 的符號在 shell 是有特殊意義的,因此, 我們必須要使用字元   \ 來讓他失去特殊意義才行。 至於 {} 的語法是這樣的,假設我要找到兩個 o 的字串,可以是:

# grep -n 'o\' regular_express.txt

假設我們要找出 g 後面接 2 到 5 個 o ,然後再接乙個 g 的字串,他會是這樣:

# grep -n 'go\g' regular_express.txt

如果我想要的是 2 個 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:

# grep -n 'go\g' regular_express.txt

使用擴充套件grep的主要好處是增加了額外的正規表示式元字符集。

列印所有包含nw或ea的行。如果不是使用egrep,而是grep,將不會有結果查出。

# egrep 'nw|ea' testfile

對於標準grep,如果在擴充套件元字元前面加\,grep會自動啟用擴充套件選項-e。

#grep 'nw\|ea' testfile

搜尋所有包含乙個或多個3的行。

# egrep '3+' testfile

# grep -e '3+' testfile

# grep '3\+' testfile

搜尋所有包含0個或1個小數點字元的行。

# egrep '2\.?[0-9]' testfile

# grep -e '2\.?[0-9]' testfile

# grep '2\.\?[0-9]' testfile

#首先含有2字元,其後緊跟著0個或1個點,後面再是0和9之間的數字。

搜尋乙個或者多個連續的no的行。

# egrep '(no)+' testfile

# grep -e '(no)+' testfile

# grep '\(no\)\+' testfile #3個命令返回相同結果,

5.不使用正規表示式

fgrep 查詢速度比grep命令快,但是不夠靈活:它只能找固定的文字,而不是規則表示式。

如果你想在乙個檔案或者輸出中找到包含星號字元的行

#fgrep  '*' /etc/profile

#grep -f '*' /etc/profile

Linux中grep命令學習

grep acinv color auto 搜尋字串 filename 選項與引數 a 將 binary 檔案以 text 檔案的方式搜尋資料 c 計算找到 搜尋字串 的次數 i 忽略大小寫的不同,所以大小寫視為相同 n 順便輸出行號 v 反向選擇,亦即顯示出沒有 搜尋字串 內容的那一行!將 etc...

Linux命令學習之grep命令

格式 grep options pattern file grep命令堆在輸入或指定的檔案中查詢包含匹配指定模式的字元的行。grep的輸出就是包含了匹配模式的行。原始檔內容 ocetl yxddn65 demo more file12 46315 9510 ocetl yxddn65 demo gr...

Linux學習之grep命令

參考資料 root www dmesg grep n a3 b2 color auto eth 245 pci setting irq 10 as level triggered 246 acpi pci interrupt 0000 00 0e.0 a link lnkb 247 eth0 rea...