grep命令的全稱是全局正則表達(dá)式打印,它是Linux中功能最強(qiáng)大且最常用的命令之一。
grep在一個(gè)或多個(gè)輸入文件中搜索與指定模式匹配的行,并將匹配行寫入標(biāo)準(zhǔn)輸出。如果未指定文件,grep則從標(biāo)準(zhǔn)輸入讀取內(nèi)容。
grep讀取的標(biāo)準(zhǔn)輸入通常是另一個(gè)命令的輸出。在本教程中,我們將通過(guò)實(shí)際示例向您展示如何使用grep
命令,并詳細(xì)說(shuō)明最常用的GNU grep
選項(xiàng)。
grep 命令
在開(kāi)始使用grep
命令之前,讓我們先回顧一下grep基本語(yǔ)法。grep
命令表達(dá)式采用形式grep [OPTIONS] PATTERN [FILE...]
。
方括號(hào)中的選項(xiàng)是可選的。其中OPTIONS
可以零個(gè)或多個(gè)選項(xiàng)。Grep提供了個(gè)用于控制其行為的選項(xiàng)。
PATTERN
搜索模式,可以是正則表達(dá)式。FILE
零個(gè)或多個(gè)輸入文件名。要能夠搜索文件,運(yùn)行命令的用戶必須對(duì)該文件具有讀取權(quán)限。
搜索字符串
grep命令的最基本用法是在文件中搜索字符串。例如,要搜索etc/passwd
文件包含字符串bash的行,請(qǐng)運(yùn)行命令grep bash etc/passwd
。
如果字符串包含空格,則需要將其用單引號(hào)或雙引號(hào)引起來(lái),例如搜索Gnome Display Manager
,請(qǐng)運(yùn)行命令grep "Gnome Display Manager" etc/passwd
。
grep bash etc/passwd
grep "Gnome Display Manager" etc/passwd
root:x:0:0:root:/root:/bin/bash
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash
grep排除與反轉(zhuǎn)匹配
要顯示與模式不匹配的行,請(qǐng)使用-v
/--invert-match
選項(xiàng)。例如,要打印etc/passwd
文件中不包含字符串nologin
的行。
請(qǐng)運(yùn)行命令grep -v nologin etc/passwd
。
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
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash
grep 搜索標(biāo)準(zhǔn)輸出
除了指定搜索文件之外,您還可以將另一個(gè)命令的標(biāo)準(zhǔn)輸出傳遞給grep
,然后僅打印與指定模式匹配的行。
例如命令ps -ef | grep www-data
將查找系統(tǒng)以www-data
用戶運(yùn)行的進(jìn)程,可以運(yùn)行ps
命令然后通過(guò)管道傳遞給grep進(jìn)行搜索沒(méi)。
你可能沒(méi)有注意到命令ps -ef | grep www-data
的標(biāo)準(zhǔn)輸出還包含當(dāng)前grep
進(jìn)程的行。
如果您不希望顯示該行,則可將標(biāo)準(zhǔn)輸出再次通過(guò)管道傳遞到另一個(gè)grep實(shí)例排除grep進(jìn)程的輸出。例如命令ps -ef | grep www-data | grep -v grep
。
ps -ef | grep www-data
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
遞歸搜索
要使用遞歸搜索模式,請(qǐng)使用-r
/--recursive
選項(xiàng)。這將搜索指定目錄中的所有文件,并跳過(guò)遞歸遇到的符號(hào)鏈接。
如果需要要跟蹤所有符號(hào)鏈接,請(qǐng)使用-R
/--dereference-recursive
選項(xiàng)。
例如命令grep -r myfreax.com /etc
將在/etc
目錄內(nèi)搜索包含myfreax.com
字符串的所有文件。
命令將以文件的路徑為前綴的打印匹配的行,并使用冒號(hào)分隔:
。你也可以使用-R
選項(xiàng)搜索所有符號(hào)鏈接的文件。
grep -r myfreax.com /etc
grep -R myfreax.com /etc
僅顯示文件名
要取消默認(rèn)的grep命令打印的輸出,僅打印包含匹配模式的文件名,可以使用-l
/--files-with-matches
選項(xiàng)。
例如命令grep -l myfreax.com *.conf
將在當(dāng)前工作目錄中搜索所有以.conf
結(jié)尾的文件。并僅打印包含字符串myfreax.com
的文件名稱。
你也可以組合-l
選項(xiàng)與-R
選項(xiàng)進(jìn)行遞歸搜索文件。
grep -l myfreax.com *.conf
grep -Rl myfreax.com /tmp
tmux.conf
haproxy.conf
不區(qū)分大小寫
默認(rèn)情況下grep
命令區(qū)分大小寫。這意味著將大寫和小寫字符視為不同的字符。
要在搜索時(shí)忽略大小寫,請(qǐng)使用-i
/--ignore-case
選項(xiàng)。例如命令grep Zebra /usr/share/words
將搜索Zebra
,不顯示任何輸出。
但是,如果使用-i
選項(xiàng)執(zhí)行不區(qū)分大小寫的搜索,則它將同時(shí)匹配大小寫字母。
grep Zebra /usr/share/words
grep -i Zebra /usr/share/words
zebra
zebra's
zebras
搜索全詞
搜索gnu時(shí),grep
還將打印gnu嵌入在較大字詞的行,例如cygnus
或magnum
。要僅返回指定字符串是整個(gè)單詞的行,請(qǐng)使用-w
/--word-regexp
選項(xiàng)。
單詞字符包括字母數(shù)字字符a-z
,A-Z
和0-9
和下劃線_
。所有其他字符都被視為非單詞字符,例如$
等。
如果使用-w
選項(xiàng)運(yùn)行與上述相同的命令,grep命令則將僅返回gnu
作為單獨(dú)單詞的行。
grep gnu /usr/share/words
grep -w gnu /usr/share/words
gnu
顯示行號(hào)
要顯示與模式匹配的行號(hào),請(qǐng)使用-n
/--line-number
選項(xiàng)。使用此選項(xiàng)時(shí),grep
將匹配項(xiàng)打印到標(biāo)準(zhǔn)輸出,并以找到的行號(hào)作為前綴。
例如命令grep -n 10000 etc/services
,將在etc/services
文件搜索包含bash
字符的行。
以下輸出顯示在10423和10424行中找到的包含10000的行。
grep -n 10000 etc/services
10423:ndmp 10000/tcp
10424:ndmp 10000/udp
匹配統(tǒng)計(jì)
要打印與標(biāo)準(zhǔn)輸出匹配的行數(shù),請(qǐng)使用-c
/--count
選項(xiàng)。在以下示例中,我們統(tǒng)計(jì)以/usr/bin/zsh
為默認(rèn)shell的帳戶數(shù)量。
grep -c '/usr/bin/zsh' etc/passwd
4
多模式與字符串搜索
grep允許可以使用或運(yùn)算符組合兩個(gè)或多個(gè)搜索模式。
默認(rèn)情況下,grep
將模式解釋為基本正則表達(dá)式。諸如|
之類的元字符會(huì)失去其特殊含義,必須使用其反斜杠版本。
如果使用擴(kuò)展的正則表達(dá)式選項(xiàng)-E
/--extended-regexp
,則不應(yīng)對(duì)或運(yùn)算符|
進(jìn)行轉(zhuǎn)義。
在下面的示例中,我們?cè)贜ginx錯(cuò)誤日志文件中搜索單詞fatal
,error
和critical
匹配的行。
grep 'fatal\\|error\\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log
靜默模式
-q
/--quiet
選項(xiàng)指示grep
不向終端寫入任何內(nèi)容,通常是標(biāo)準(zhǔn)輸出。如果搜索到匹配的行,grep命令的退出代碼將會(huì)是0。
這在檢查文件是否包含指定字符串,并根據(jù)結(jié)果執(zhí)行某些操作的shell腳本中使用grep時(shí),這會(huì)很有用。
這是在if
語(yǔ)句中使用grep靜默模式作為測(cè)試命令的示例。
if grep -q PATTERN filename
then
echo pattern found
else
echo pattern not found
fi
正則表達(dá)式基礎(chǔ)
GNU Grep具有兩個(gè)正則表達(dá)式功能集,即Basic基本和Extended擴(kuò)展。默認(rèn)情況下,grep
將模式解釋為基本正則表達(dá)式。
^
符號(hào)表示匹配行首,$
符號(hào)匹配行尾,.
符號(hào)以匹配任意單個(gè)字符,[ ]
中括號(hào)匹配指定范圍的字符,[^ ]
以匹配非中括號(hào)內(nèi)的任意字符。
要轉(zhuǎn)義字符的特殊含義,請(qǐng)使用反斜杠符號(hào)\\
,例如要匹配符號(hào)$
,你將以這樣的形式轉(zhuǎn)義\\$
符號(hào)。
例如命令grep "^kangaroo" file.txt
,將匹配字符串行首是kangaroo
的行。命令grep "kangaroo$" file.txt
匹配行尾是kangaroo$
的行。
grep "^kangaroo" file.txt
grep "kangaroo$" file.txt
命令grep "kan..roo" file.txt
匹配kan
接著是兩個(gè)任意字符,然后是roo
的行。命令grep "acce[np]t" file.txt
將會(huì)匹配accept
或accent
的行。
模式co[^l]a
將匹配包含co任何字符串a(chǎn)
的行,例如coca
,cobalt
等,但不匹配包含cola
的行。
grep "kan..roo" file.txt
grep "acce[np]t" file.txt
grep "co[^l]a" file.txt
擴(kuò)展的正則表達(dá)式
要將模式解釋為擴(kuò)展的正則表達(dá)式,請(qǐng)使用-E
/--extended-regexp
選項(xiàng)。擴(kuò)展的正則表達(dá)式包括所有基本元字符。以及用于創(chuàng)建更復(fù)雜搜索模式的其他元字符。
在指定文件中提取電子郵件地址
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
選項(xiàng)用于僅打印匹配的字符串。
打印匹配行前半與后半部分
要在匹配行之前打印指定數(shù)量的行,請(qǐng)使用-B
/--before-context
選項(xiàng)。要在匹配的行之后打印指定數(shù)量的行,請(qǐng)使用-A
/--after-context
選項(xiàng)。
例如,要在匹配的行之前打印前五行,請(qǐng)運(yùn)行命令grep -B 5 root etc/passwd
。
命令grep -A 5 root etc/passwd
在匹配的行之后顯示尾隨五行。這個(gè)有點(diǎn)類似在指定位置截?cái)唷?/p>
grep -B 5 root etc/passwd
grep -A 5 root etc/passwd
結(jié)論
grep
命令允許您在文件內(nèi)部使用搜索模式。如果找到匹配項(xiàng),則grep將打印包含指定模式的行。請(qǐng)?jiān)L問(wèn)Grep用戶手冊(cè)頁(yè)面,了解Grep的更多信息。
-
Linux
+關(guān)注
關(guān)注
87文章
11232瀏覽量
208960 -
命令
+關(guān)注
關(guān)注
5文章
678瀏覽量
21987 -
grep
+關(guān)注
關(guān)注
0文章
22瀏覽量
4716
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論