首頁 > 軟體

Linux中的Grep命令(在檔案中查詢文字)

2020-06-16 16:11:47

grep命令是(global regular expression print,全域性正規表示式輸出)的縮寫,它是Linux中功能最強大且最常用的命令之一。

grep在一個或多個輸入檔案中搜尋與給定模式匹配的行,並將每條匹配行寫入標準輸出。 如果未指定檔案,則grep將從標準輸入讀取,該輸入通常是另一個命令的輸出。

在本文中,我們將通過實際範例和最常見的GNU grep選項的詳細說明,向您展示如何使用grep命令。

grep命令語法

grep命令的語法如下:

grep [OPTIONS] PATTERN [FILE...]

方括號中的專案是可選的。

  • OPTIONS - 零個或多個選項。 Grep包含許多控制其行為的選項。
  • PATTERN - 搜尋模式。
  • FILE - 零個或多個輸入檔名。

為了能夠搜尋檔案,執行命令的使用者必須對該檔案具有讀取許可權。

在檔案中搜尋字串

grep命令最基本的用法是在檔案中搜尋字串(文字)。

例如,要顯示/etc/passwd檔案中包含字串bash的所有行,請執行以下命令:

[linuxidc@localhost ~/www.linuxidc.com]$ grep bash /etc/passwd

輸出應如下所示:

如果字串包含空格,則需要將其用單引號或雙引號引起來:

[linuxidc@localhost ~/www.linuxidc.com]$grep "Gnome Display Manager" /etc/passwd

反轉匹配(排除)

要顯示與模式不匹配的行,請使用-v(或--invert-match)選項。

例如,要列印不包含字串nologin的行,可以使用:

[linuxidc@localhost ~/www.linuxidc.com]$grep -v nologin /etc/passwd

使用Grep過濾命令的輸出

可以使用grep通過管道過濾命令的輸出,並且只有與給定模式匹配的行才會列印在終端上。

例如,要找出哪些系統以使用者www-data的身份在系統上執行,可以使用以下ps命令:

[linuxidc@localhost ~/www.linuxidc.com]$ps -ef | grep www-data
linuxidc  3980  3865  0 22:26 pts/1    00:00:00 grep --color=auto www-data

您也可以在命令中連結多個管道。 如您在上面的輸出中看到的,還有一行包含grep進程。 如果您不希望顯示該行,則將輸出傳遞到另一個grep範例,如下所示。

[linuxidc@localhost ~/www.linuxidc.com]$ps -ef | grep www-data | grep -v grep

遞回搜尋

要遞回搜尋模式,請使用-r選項(或--recursive)呼叫grep。 使用此選項時,grep將搜尋指定目錄中的所有檔案,並跳過遞回遇到的符號連結。

要跟隨所有符號連結,請使用-R選項(或--dereference-recursive),而不是-r。

這是顯示如何在/etc目錄內的所有檔案中搜尋字串linuxidc的範例:

[root@localhost /home/linuxidc/www.linuxidc.com]$grep -r linuxidc /etc

輸出將包含以檔案的完整路徑為字首的匹配行:

如果使用-R選項,則grep將跟隨所有符號連結:

[root@ www.linuxidc.com]$grep -R linuxidc.com /etc

注意下面輸出的最後一行。 當用-r呼叫grep時,不會列印該行,因為Nginx啟用站點的目錄中的檔案是指向可用站點目錄中的組態檔的符號連結。

/etc/hosts:127.0.0.1 node2.linuxidc.com

/etc/nginx/sites-available/linuxidc.com:    server_name linuxidc.com  www.linuxidc.com;
/etc/nginx/sites-enabled/linuxidc.com:    server_name linuxidc.com  www.linuxidc.com;

僅顯示檔名

要取消預設grep輸出並僅列印包含匹配模式的檔名,請使用-l(或--files-with-matches)選項。

以下命令在當前工作目錄中搜尋所有以.conf結尾的檔案,並僅顯示包含字串linuxidc.com的檔案的名稱:

$grep -l linuxidc.com *.conf

輸出將如下所示:

tmux.conf
haproxy.conf

-l選項通常與遞回選項-R結合使用:

$grep -Rl linuxidc.com /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”,則將以較大的單詞(例如“ cygnus”或“ magnum”)嵌入“ gnu”的所有行都將匹配:

$grep gnu /usr/share/words

cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut

要僅返回指定字串是整個單詞(用非單詞字元括起來)的那些行,請使用-w(或--word-regexp)選項。

文字字元包括字母數位字元(a-z,A-Z和0-9)和下劃線(_)。 所有其他字元均視為非單詞字元。

如果您執行與上述相同的命令,包括-w選項,則grep命令將僅返回其中包含gnu作為單獨單詞的那些行。

$grep -w gnu /usr/share/words

gnu

顯示行號

-n(或--line-number)選項告訴grep顯示包含與模式匹配的字串的行的行號。 使用此選項時,grep將匹配項列印到以行號為字首的標準輸出。

例如,要顯示/etc/services檔案中的包含字串bash並帶有匹配行號的行,可以使用以下命令:

[linuxidc@localhost etc]$ grep -n 10000 /etc/services

下面的輸出顯示在行10423和10424上找到匹配項。

10445:ndmp            10000/tcp              # Network Data Management Protocol
10446:ndmp            10000/udp              # Network Data Management Protocol

Count函數匹配

若要將匹配行數列印到標準輸出,請使用-c(或 --count)選項。

在下面的範例中,我們將計算以/usr/bin/zsh作為shell的帳戶數量。

$regular expression$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

Basic正規表示式

GNU Grep具有三個正規表示式功能集,Basic、 Extended 和 perl 相容

預設情況下,grep將模式解釋為基本的正規表示式,其中除元字元之外的所有字元實際上都是與自己匹配的正規表示式。

以下是最常用的元字元的列表:

使用^(插入符號)符號可在行首匹配表示式。 在下面的範例中,僅當字串kangaroo出現在行的開頭時才匹配。

$grep "^kangaroo" file.txt

使用$(美元)符號來匹配行尾的表示式。 在下面的範例中,僅當字串kangaroo出現在行的最後時才匹配。

$grep "kangaroo$" file.txt

使用.(點)符號以匹配任何單個字元。 例如,要匹配以kan開頭,然後有兩個字元並以字串roo結尾的任何內容,可以使用以下模式:

$grep "kan..roo" file.txt

使用[](括號)來匹配括號中包含的任何單個字元。 例如,找到包含accept或“ accent”的行,可以使用以下模式:

$grep "acce[np]t" file.txt


使用[^]來匹配不在括號內的任何單個字元。下面的模式將匹配任何包含co(any_letter_except_l)a的字串組合,如coca、cobalt等,但不匹配包含cola的行,

$grep "co[^l]a" file.txt

要跳脫下一個字元的特殊含義,請使用(反斜槓)符號。

Extended正規表示式

要將模式解釋為擴充套件的正規表示式,請使用-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紀錄檔錯誤檔案中搜尋所有出現的致命,錯誤和嚴重的單詞:

$grep 'fatal|error|critical' /var/log/nginx/error.log

如果使用擴充套件正規表示式選項-E,則不應跳脫運算子|,如下所示:

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

在匹配之前列印行

要在匹配行之前列印特定數量的行,請使用-B(或 --before-context)選項。

例如,要在匹配行之前顯示5行前奏上下文,可以使用以下命令:

$grep -B 5 root /etc/passwd

匹配後列印行

若要在匹配行之後列印特定數量的行,請使用-A(或 --after-context)選項。

例如,要在匹配行之後顯示尾隨上下文的五行,可以使用以下命令:

$grep -A 5 root /etc/passwd

總結

grep命令允許您在檔案內部搜尋模式。 如果找到匹配項,則grep列印包含指定模式的行。

在Grep使用者手冊頁上,還有更多有關Grep的知識。

如果您有任何問題或反饋,請隨時發表評論。


IT145.com E-mail:sddin#qq.com