天天看點

Linux常用指令03 - grep

grep 指令代表“全局正規表達式 print” ,它是 Linux 中最強大和最常用的指令之一。

Linux常用指令03 - grep

grep 在一個或多個輸入檔案中搜尋與給定模式比對的行,并将每個比對行寫入标準輸出。 如果沒有指定檔案,

grep

将從标準輸入讀取,這通常是另一個指令的輸出。

在本文中,我們将通過執行個體和對最常見的 GNU

grep

選項的詳細說明,向您展示如何使用

grep

指令。

Linux常用指令03 - grep

grep

指令文法

grep 指令的文法如下:

grep [OPTIONS] PATTERN [FILE...]           

複制

方括号中的項目是可選的。

OPTIONS - 既然可選,就是可以要可不要。

PATTERN - 搜尋模式

FILE - 零個或多個輸入檔案名

為了能夠搜尋該檔案,運作該指令的使用者必須具有對該檔案的讀通路權。

搜尋檔案中的字元串

grep 指令最基本的用法是在檔案中搜尋字元串(文本)。

For example, to display all the lines containing the string bash from the /etc/passwd file, you would run the following command:

例如,要顯示/etc/passwd 檔案中包含字元串 bash 的所有行,可以運作以下指令:

grep bash /etc/passwd           

複制

輸出應該是這樣的:

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash           

複制

如果字元串包含空格,需要用單引号或雙引号将其括起來:

grep "Gnome Display Manager" /etc/passwd           

複制

反相比對(排除)

若要顯示與模式不比對的行,請使用-v (或 --invert-match)選項。

例如,要列印不包含字元串 nologin 的行,可以使用:

grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash           

複制

使用

grep

篩選指令的輸出

指令的輸出可以通過管道使用

grep

進行過濾,并且隻有與給定模式比對的行才會列印在終端上。

例如,要查找系統中作為使用者 www-data 運作的程序,可以使用以下 ps 指令:

ps -ef | grep www-data
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 `grep` --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process           

複制

您還可以根據指令連接配接多個管道。 正如您在上面的輸出中看到的,還有一行包含

grep

程序。 如果不希望顯示該行,則将輸出傳遞給另一個

grep

執行個體,如下所示。

ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 `grep` --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process           

複制

遞歸搜尋

要遞歸搜尋模式,可以使用 -r 選項(或 --recursive)調用

grep

。 當使用此選項時,

grep

将搜尋指定目錄中的所有檔案,遞歸地跳過遇到的符号連結。

若要跟蹤所有符号連結,請使用-R 選項,而不是-r。

下面的示例示範如何在/etc 目錄中的所有檔案中搜尋字元串 chasays.github.io:

grep -r chasays.github.io /etc           

複制

輸出将包括以檔案的完整路徑為字首的比對行:

/etc/hosts:127.0.0.1 node2.chasays.github.io
/etc/nginx/sites-available/chasays.github.io:    server_name chasays.github.io   www.chasays.github.io;           

複制

如果使用-r 選項,

grep

将跟随所有符号連結:

grep -R chasays.github.io /etc

注意下面輸出的最後一行。 當使用-rmr 調用

grep

時,不會列印該行,因為 Nginx 啟用站點的目錄中的檔案是到 sites-available 目錄中的配置檔案的符号連結。

/etc/hosts:127.0.0.1 node2.chasays.github.io
/etc/nginx/sites-available/chasays.github.io:    server_name chasays.github.io   chasays.github.io;
/etc/nginx/sites-enabled/chasays.github.io:    server_name chasays.github.io   chasays.github.io;           

複制

隻顯示檔案名

若要禁止預設

grep

輸出并隻列印包含比對模式的檔案名,請使用-l (或 --files-with-matches)選項。

下面的指令搜尋所有以。 在目前工作目錄中輸出包含字元串 linuxize. com 的檔案名:

grep -l chasays.github.io *.conf           

複制

輸出結果如下:

tmux.conf
haproxy.conf           

複制

The -l option is usually used in combination with the recursive option -R:

-l 選項通常與遞歸選項 -R 結合使用:

grep -Rl chasays.github.io /tmp           

複制

不區分大小寫的搜尋

預設情況下,

grep

區分大小寫,這意味着大小寫字元被視為不同字元。

若要在搜尋時忽略大小寫,請使用-i 選項(或 --ignore-case)調用

grep

例如,當搜尋沒有任何選項的 Zebra 時,下面的指令不會顯示任何輸出,即有比對的行:

grep Zebra /usr/share/words           

複制

但是如果使用-i 選項執行不區分大小寫的搜尋,它将比對大小寫字母:

grep -i Zebra /usr/share/words           

複制

指定“ Zebra”将比對“ Zebra”、“ Zebra”或該字元串的任何其他大小寫字母組合。

zebra
zebra's
zebras           

複制

搜尋全文

在搜尋字元串時,

grep

将顯示字元串嵌入較大字元串中的所有行。

例如,如果搜尋“ gnu” ,所有“ gnu”嵌入在較大單詞中的行,如“ cygnus”或“ magnum”将被比對:

grep gnu /usr/share/words

cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut           

複制

若要僅傳回指定字元串為整個單詞(由非單詞字元括起來)的那些行,請使用-w (或 --word-regexp)選項。

字元包括字母數字字元(a-z, A-Z, and ,及0-9) ( )及下劃線(_). 所有其他字元都視為非字元

如果您運作與上面相同的指令(包括 -w 選項) ,

grep

指令将隻傳回 gnu 作為單獨的單詞包含的那些行。

grep -w gnu /usr/share/words
gnu           

複制

顯示行号

-n (或 --line-number)選項告訴

grep

顯示包含與模式比對的字元串的行的行号。 使用此選項時,

grep

将比對内容列印到以行号為字首的标準輸出。

例如,要顯示/etc/services 檔案中包含以比對行号作為字首的字元串 bash 的行,可以使用以下指令:

grep -n 10000 /etc/services           

複制

下面的輸出顯示比對項在第10423和10424行。

10423:ndmp            10000/tcp
10424:ndmp            10000/udp           

複制

計數比對

若要将比對行數列印到标準輸出,請使用 -c (或 --count)選項。

在下面的示例中,我們計算了将/usr/bin/zsh 作為 shell 的帳戶數量。

grep -c '/usr/bin/zsh' /etc/passwd

4           

複制

安靜模式

Q (或 --quiet)告訴

grep

在安靜模式下運作,不要在标準輸出上顯示任何内容。 如果找到比對項,則該指令退出狀态為0。 在 shell 腳本中使用

grep

時,這非常有用,您希望檢查檔案是否包含字元串,并根據結果執行特定操作。

下面是一個在靜默模式下使用

grep

作為 if 語句中的測試指令的示例:

if `grep` -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi           

複制

基本正規表達式

Gnu

grep

有三個正規表達式特性集,Basic、 Extended 和 perl 相容。

預設情況下,

grep

将模式解釋為基本正規表達式,其中除元字元外的所有字元實際上都是比對自身的正規表達式。

下面是最常用的元字元清單:

使用 ^ (插入符号)符号來比對行開頭的表達式。 在下面的示例中,隻有當字元串 kangaroo 出現在行的開頭時,它才會比對。

grep "^kangaroo" file.txt           

複制

使用 $(dollar)符号來比對行尾的表達式。 在下面的示例中,隻有當字元串 kangaroo 出現在行的末尾時,它才會比對。

grep "kangaroo$" file.txt           

複制

使用。 (句号)符号來比對任何單個字元。 例如,要比對以 kan 開頭,然後有兩個字元和以字元串 roo 結尾的任何内容,您可以使用以下模式:

grep "kan..roo" file.txt           

複制

使用比對括在方括号中的任何單個字元。 例如,找到包含 accept 或者 accent 的行,你可以使用以下模式:

grep "acce[np]t" file.txt           

複制

使用 ^ 比對括在方括号中的任何單個字元。 下面的模式将比對包含 co (除了 l 以外的任何字母) a 的任何字元串組合,如可可、钴等,但不比對包含可樂的線,

grep "co[^l]a" file.txt           

複制

若要轉義下一個字元的特殊含義,請使用(反斜杠)符号。

擴充的正規表達式

若要将模式解釋為擴充正規表達式,請使用-e (或 --extended-regexp)選項。 擴充的正規表達式包括所有基本元字元,以及用于建立更複雜、更強大的搜尋模式的附加元字元。 以下是一些例子:

比對并提取給定檔案中的所有電子郵件位址:

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt           

複制

比對并提取給定檔案中的所有有效 IP 位址:

grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt           

複制

O 選項僅用于列印比對的字元串。

搜尋多個字元串(模式)

可以使用 OR 操作符 | 連接配接兩個或多個搜尋模式。

預設情況下,

grep

将模式解釋為一個基本的正規表達式,其中 | 等元字元失去了它們的特殊含義,必須使用它們的反斜線版本。

在下面的例子中,我們正在 Nginx 日志錯誤檔案中搜尋出現的詞彙 fatal,error,critical:

grep 'fatal\|error\|critical' /var/log/nginx/error.log           

複制

如果使用擴充正規表達式選項-e,則不應轉義運算符 | ,如下所示:

grep -E 'fatal|error|critical' /var/log/nginx/error.log           

複制

在比對之前列印行

若要在比對行之前列印特定行數,請使用-b (或 --before-context)選項。

例如,要在比對行之前顯示五行前導上下文,可以使用以下指令:

grep -B 5 root /etc/passwd           

複制

Linux常用指令03 - grep

比對後列印行

若要在比對行之後列印特定行數,請使用 -a (或 --after-context)選項。

例如,要在比對行之後顯示五行尾随上下文,可以使用以下指令:

grep -A 5 root /etc/passwd           

複制

Linux常用指令03 - grep

小結

grep 指令允許您在檔案内搜尋模式。 如果找到比對項,

grep

将列印包含指定模式的行。

grep

使用者手冊頁面上有很多關于

grep

的資訊。

https://www.gnu.org/software/

grep

/manual/

grep

.html