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

grep命令搜索字符串之技巧
12個 Linux 中 grep 命令的超級用法實(shí)例
linux grep命令詳解
Linux 中 grep 命令的超級用法實(shí)例
使用grep命令需要了解的12個實(shí)例
全面解析Linux的grep命令中正則表達(dá)式的用法
Linux中用grep命令來搜索單詞及統(tǒng)計(jì)匹配的行數(shù)
Linux在在文件中查找文本的Grep命令
linux的scp命令怎么用_linux的grep命令用法

評論