0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用grep命令

CHANBAEK ? 來(lái)源:myfreax ? 作者:myfreax ? 2022-12-06 16:43 ? 次閱讀

grep命令的全稱(chēng)是全局正則表達(dá)式打印,它是Linux中功能最強(qiáng)大且最常用的命令之一。

grep在一個(gè)或多個(gè)輸入文件中搜索與指定模式匹配的行,并將匹配行寫(xiě)入標(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)行命令的用戶(hù)必須對(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用戶(hù)運(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的文件名稱(chēng)。

你也可以組合-l選項(xiàng)與-R選項(xiàng)進(jìn)行遞歸搜索文件。

grep -l myfreax.com *.conf
grep -Rl myfreax.com /tmp
tmux.conf
haproxy.conf

不區(qū)分大小寫(xiě)

默認(rèn)情況下grep命令區(qū)分大小寫(xiě)。這意味著將大寫(xiě)和小寫(xiě)字符視為不同的字符。

要在搜索時(shí)忽略大小寫(xiě),請(qǐng)使用-i/--ignore-case選項(xiàng)。例如命令grep Zebra /usr/share/words將搜索Zebra,不顯示任何輸出。

但是,如果使用-i選項(xiàng)執(zhí)行不區(qū)分大小寫(xiě)的搜索,則它將同時(shí)匹配大小寫(xiě)字母。

grep Zebra /usr/share/words
grep -i Zebra /usr/share/words
zebra
zebra's
zebras

搜索全詞

搜索gnu時(shí),grep還將打印gnu嵌入在較大字詞的行,例如cygnusmagnum。要僅返回指定字符串是整個(gè)單詞的行,請(qǐng)使用-w/--word-regexp選項(xiàng)。

單詞字符包括字母數(shù)字字符a-z,A-Z0-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的帳戶(hù)數(shù)量。

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

多模式與字符串搜索

grep允許可以使用或運(yùn)算符組合兩個(gè)或多個(gè)搜索模式。

默認(rèn)情況下,grep將模式解釋為基本正則表達(dá)式。諸如|之類(lèi)的元字符會(huì)失去其特殊含義,必須使用其反斜杠版本。

如果使用擴(kuò)展的正則表達(dá)式選項(xiàng)-E/--extended-regexp,則不應(yīng)對(duì)或運(yùn)算符|進(jìn)行轉(zhuǎn)義。

在下面的示例中,我們?cè)贜ginx錯(cuò)誤日志文件中搜索單詞fatal,errorcritical匹配的行。

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

靜默模式

-q/--quiet選項(xiàng)指示grep不向終端寫(xiě)入任何內(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ì)匹配acceptaccent的行。

模式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)類(lèi)似在指定位置截?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用戶(hù)手冊(cè)頁(yè)面,了解Grep的更多信息。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209498
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    684

    瀏覽量

    22026
  • grep
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    4728
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux中grep命令的12個(gè)實(shí)際例子

    Linux中grep命令的12個(gè)實(shí)際例子
    發(fā)表于 02-08 09:38 ?702次閱讀

    [4.4]--Linux中grep命令

    Linux
    jf_90840116
    發(fā)布于 :2023年02月19日 20:39:28

    grep命令搜索字符串之技巧

    insight就能派上用場(chǎng)。但source insight有時(shí)候會(huì)莫名其妙的無(wú)法搜索字符串,可能是工程文件遭到破壞,必須重新創(chuàng)建工程才可以。其實(shí)我們也可以用linux下文本搜索工具grep,作者在工作當(dāng)中
    發(fā)表于 12-17 23:34

    linux下的grep命令有什么區(qū)別?

    下面兩個(gè)命令有什么區(qū)別1.grep . "abc" *2.grep . "abc"
    發(fā)表于 09-17 16:59

    12個(gè) Linux 中 grep 命令的超級(jí)用法實(shí)例

    install grep #Debian/Ubuntu $ sudo yum install grep #RHEL/CentOS/Fedora我發(fā)現(xiàn)使用現(xiàn)實(shí)世界中的真實(shí)例子讓你投身其中是讓你接觸grep
    發(fā)表于 05-12 08:00

    linux grep命令詳解

    工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來(lái)?! nix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是
    發(fā)表于 03-31 10:05

    Linux 中 grep 命令的超級(jí)用法實(shí)例

    你是否遇到過(guò)需要在文件中查找一個(gè)特定的字符串或者樣式,但是不知道從哪兒開(kāi)始?那么,就請(qǐng)grep來(lái)幫你吧。
    的頭像 發(fā)表于 03-17 09:01 ?4642次閱讀

    使用grep命令需要了解的12個(gè)實(shí)例

    grep是每個(gè)Linux發(fā)行版都預(yù)裝的一個(gè)強(qiáng)有力的文件模式搜索工具。無(wú)論何種原因,如果你的系統(tǒng)沒(méi)有預(yù)裝它的話(huà),你可以很容易的通過(guò)系統(tǒng)的包管理器來(lái)安裝它(Debian/Ubuntu系中的apt-get和RHEl/CentOS/Fedora系中的yum)。
    發(fā)表于 05-12 10:16 ?1119次閱讀

    全面解析Linux的grep命令中正則表達(dá)式的用法

    Linux 附帶有 GNU grep 命令工具,它支持?jǐn)U展正則表達(dá)式extended regular expressions,而且 GNU grep 在所有的 Linux 系統(tǒng)中都
    發(fā)表于 04-02 14:46 ?529次閱讀

    Linux中用grep命令來(lái)搜索單詞及統(tǒng)計(jì)匹配的行數(shù)

    使用 grep 命令來(lái)搜索多個(gè)單詞要使用 grep 命令來(lái)搜索多個(gè)字符串或單詞,我們?cè)撛趺醋??例如我想要查?/path/to/file 文件中的 word1、word
    發(fā)表于 04-02 14:46 ?641次閱讀

    Linux在在文件中查找文本的Grep命令

    grep命令是(global regular expression print,全局正則表達(dá)式輸出)的縮寫(xiě),它是Linux中功能最強(qiáng)大且最常用的命令之一。
    的頭像 發(fā)表于 06-21 12:06 ?3319次閱讀

    linux的scp命令怎么用_linux的grep命令用法

    在linux中,scp命令用于Linux之間復(fù)制文件和目錄,即在一臺(tái)Linux服務(wù)器中將本地的文件上傳到一臺(tái)遠(yuǎn)端服務(wù)器,或?qū)⑦h(yuǎn)端服務(wù)器的文件下載到本地。scp是linux系統(tǒng)下基于ssh登陸進(jìn)行安全的遠(yuǎn)程文件拷貝命令。
    發(fā)表于 09-04 15:36 ?4427次閱讀
    linux的scp<b class='flag-5'>命令</b>怎么用_linux的<b class='flag-5'>grep</b><b class='flag-5'>命令</b>用法

    如何使用grep命令的多種搜索模式及搜索多個(gè)字符串

    今天向大家介紹一個(gè)非常有用的技巧,那就是使用 grep 命令查找多個(gè)字符串。簡(jiǎn)單介紹一下,grep 命令可以理解為是一個(gè)功能強(qiáng)大的命令行工具
    的頭像 發(fā)表于 09-07 11:24 ?2550次閱讀

    grep命令常用的選項(xiàng)詳解

    說(shuō)明:在Rocky8系統(tǒng)中,grep默認(rèn)幫我們把匹配到的字符串標(biāo)注了紅色,這點(diǎn)還是挺貼心的。其實(shí)大家可以用which命令看一下grep,你會(huì)發(fā)現(xiàn)grep其實(shí)是
    的頭像 發(fā)表于 11-30 11:43 ?4566次閱讀

    Linux grep命令詳解

    Linux grep命令是一種非常常用的文本搜索工具,它可以在給定的文件中搜索匹配的字符串,并輸出匹配的行。grep是全稱(chēng)“global search regular expression print”,可以識(shí)別正則表達(dá)式,并使
    的頭像 發(fā)表于 12-25 09:39 ?83次閱讀