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

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

評論