grep 指令代表“全局正規表達式 print” ,它是 Linux 中最強大和最常用的指令之一。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5CMsZzcsdjY0oXNvwFN0cTMyUTMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
grep 在一個或多個輸入檔案中搜尋與給定模式比對的行,并将每個比對行寫入标準輸出。 如果沒有指定檔案,
grep
将從标準輸入讀取,這通常是另一個指令的輸出。
在本文中,我們将通過執行個體和對最常見的 GNU
grep
選項的詳細說明,向您展示如何使用
grep
指令。
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
指令的輸出可以通過管道使用
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
複制
比對後列印行
若要在比對行之後列印特定行數,請使用 -a (或 --after-context)選項。
例如,要在比對行之後顯示五行尾随上下文,可以使用以下指令:
grep -A 5 root /etc/passwd
複制
小結
grep 指令允許您在檔案内搜尋模式。 如果找到比對項,
grep
将列印包含指定模式的行。
在
grep
使用者手冊頁面上有很多關于
grep
的資訊。
https://www.gnu.org/software//manual/
grep
.html
grep