如何使用grep在Shell中的文件中查找字符串

1 GREP命令概述

grep命令,即 全局正則表達式打印,是Linux終端環境中功能最豐富的命令之一。它恰好是一個功能非常強大的程序,它允許用戶根據複雜的規則對輸入進行重新排序,使其成為許多命令鏈中相當流行的鏈接。 grep命令主要用於搜索文本或在特定文件中搜索包含與指定單詞/字符串匹配的行。默認情況下,grep打印匹配的行。您可以使用它輕鬆查找與一個或多個正則表達式匹配的文本行,並僅打印匹配的行。

2基本的grep命令語法

基本的grep命令語法為:

grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2'  filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName

3如何使用grep命令查找文件

第一個示例在Linux passwd文件中搜索用戶“ tom”。要在/ etc / passwd文件中找到用戶“ tom”,您需要輸入以下命令:

grep tom /etc/passwd

以下是示例輸出。

tom:x:1000:1000:tom,,,:/home/tom:/bin/bash

有一個選項告訴grep忽略大小寫。也就是說,它匹配abc,ABC,ABC和-i選項的所有可能組合,如下所示。

grep -i "tom" /etc/passwd

4遞歸使用grep

如果目錄層次結構中有大量文本文件(例如/ etc / apache2 //中的Apache配置文件),並且要查找定義了特定文本的文件,請使用grep命令的-r選項進行遞歸搜索。我會。這將在目錄/ etc / apache2 //及其所有子目錄中遞歸搜索字符串為“ 197.167.2.9”的文件(如下所示)。

grep -r "mydomain.com" /etc/apache2/

或者,您可以使用以下命令:

grep -R "mydomain.com" /etc/apache2/

以下是在Nginx服務器上進行類似搜索的示例輸出。

grep -r "mydomain.com" /etc/nginx//etc/nginx/sites-available/mydomain.com.vhost:        if ($http_host != "www.mydomain.com") {

在這裡,mydomain.com的結果顯示在單獨的行中,並以找到該文件的文件名開頭(例如/etc/nginx/sites-available/mydomain.com.vhost)。使用-h選項可防止文件名包含在輸出數據中(如下所述)。 grep-h -R“ mydomain.com” / etc / nginx /。以下是示例輸出。

grep -r "mydomain.com" /etc/nginx/if ($http_host != "www.mydomain.com") {

5使用grep只搜索單詞

搜索abc時,grep匹配各種組合,即kbcabc,abc123,aarfbc35等,而無需遵循單詞邊界。您可以使用grep命令僅選擇包含匹配項的行以形成整個單詞(僅匹配abc單詞的行),如下所示。

grep -w "abc" file.txt

例:

全字Grep

使用grep搜索2個不同的詞

要找到兩個不同的單詞,您需要使用egrep命令,如下所示。

egrep -w 'word1|word2' /path/to/file

7計數匹配單詞的行

grep命令可以使用-c(計數)選項來逐個報告特定模式與文件匹配的次數(請參見下文)。

grep -c 'word' /path/to/file

另外,用戶可以在每個輸出行之前使用“ -n”選項來獲取文本文件中的行號(請參見下文)。

grep -n 'root' /etc/passwd

以下是示例輸出。

1:root:x:0:0:root:/root:/bin/bash

8 Grep反向比賽

用戶可以使用-v選項突出顯示匹配項。也就是說,僅不包含指定單詞的行將被匹配。例如,使用以下命令來打印所有不包含單詞par的行。

grep -v par /path/to/file

9如何僅列出匹配文件的名稱

您應該使用以下命令列出其內容包含特定單詞(例如單詞“ primary”)的文件名。

grep -l 'primary' *.c

最後,有一個選項可以強制grep使用以下命令以特定顏色顯示輸出:

廣告

grep --color root /etc/passwd

以下是示例輸出。

僅列出與grep匹配的文件名

10如何使用grep命令處理多種搜索模式

您可能要在一個特定文件(或一組文件)中搜索多個模式。在這種情況下,必須使用grep提供的“ -e”命令行選項。

例如,假設您要搜索當前工作目錄中的所有文本文件,以查找單詞“ how”,“ to”和“ forge”。這樣做的方法如下:

廣告

grep -e how -e to -e forge *.txt

正在執行的命令是:

Grep中的多種搜索模式

“ -e”命令行選項在模式以連字符(-)開頭的情況下也很有用。例如,如果您要搜索“ -how”,則以下命令將無濟於事:

grep -how *.txt

使用-e命令行選項,該命令可以準確了解在這種情況下要查找的內容。

grep -e -how *.txt

這兩個命令的行為如下所示。

Grep -e開關

11如何將grep輸出限制為一定數量的行

如果要將grep輸出限制為一定的行數,可以使用’-m’命令行選項。例如,假設您要在testfile1.txt中搜索包含以下行的單詞“ how”:

限制Grep輸出

但是,需要的是grep在找到包含所搜索模式的三行後停止搜索。因此,為此,請運行以下命令。

廣告

grep "how" -m3 testfile1.txt

正在執行的命令是:

Grep -m開關

然後,該命令的手冊頁指出:

If the input is standard input from a regular file, and NUM matching lines are output, grep ensuresthat the standard input is positioned to just after the last matching line before exiting, regardless of the presence of trailing context lines. This enables a calling process to resume a search.

因此,例如,如果您有一個包含循環的bash腳本,並且想要為循環的每次迭代獲取一個匹配項,則應使用“ grep -m 1”。

12 grep如何從文件獲取模式

如果需要,您還可以使用grep命令從文件中獲取模式。您可以使用工具的-f命令行選項執行此操作。

例如,如果要在當前目錄中搜索所有“ .txt”文件中的單詞“ how”和“ to”,但要通過名為“ input”的文件提供這些輸入字符串:您可以做這個:

grep -f input *.txt

正在執行的命令是:

Grep獲取文件的模式

13如何使grep僅顯示與搜索模式完全匹配的行

到目前為止,我已經看到默認情況下grep會匹配並顯示帶有搜索模式的完整行。但是,如果您希望grep僅顯示與搜索到的模式完全匹配的行,則可以使用“ -x”命令行選項執行此操作。

例如,假設testfile1.txt文件包含以下行:

僅顯示完全匹配

您要搜索的模式是“你好嗎?”因此,如果您希望grep僅顯示與該模式完全匹配的行,請使用:

grep -x "how are you?" *.txt

正在執行的命令是:

Grep -x開關生效

14如何強制grep在輸出中不顯示任何內容

在某些情況下,您不需要grep命令即可在輸出中生成任何內容。相反,我只想知道是否根據命令的退出狀態找到了匹配項。可以使用-q命令行選項來實現。

-q選項使輸出靜音,但是您可以使用“ echo $?”查看該工具的退出狀態。命令。對於grep,命令成功退出時狀態為“ 0”(即找到匹配項),如果找不到匹配項,則狀態為“ 1”。

下面的屏幕截圖顯示了成功和失敗的情況。

Grep不顯示輸出

15如何為不包含搜索模式的文件創建grep顯示名稱

默認情況下,grep命令顯示包含搜索模式的文件名(和匹配的行)。這是非常合乎邏輯的,因為這是您對該工具的期望。但是,有時您需要獲取不包含所搜索模式的文件名。

也可以使用grep來完成,您可以使用–L選項來完成。因此,例如,要查找當前目錄中所有不包含單詞“ how”的文本文件,請運行以下命令:

grep -L "how" *.txt

正在執行的命令是:

Grep反向比賽廣告

16如何抑制grep生成的錯誤消息

您可以選擇強制grep使輸出中出現的錯誤消息靜音。可以使用-s命令行選項來完成。例如,考慮以下情形,其中grep會產生與發生目錄有關的錯誤/警告。

抑制grep錯誤

因此,-s命令行選項在這種情況下很有用。見下文。

grep -s開關

因此,您可以看到錯誤/警告已被靜音。

17如何使用grep遞歸搜索目錄

從上一點使用的示例中可以看到,默認情況下,grep命令不會進行遞歸搜索。要驗證grep搜索是否是遞歸的,請使用-d命令行選項並傳遞值’recurse’。

grep -d recurse "how" *

注1:也可以使用-d選項忽略上一點中描述的與目錄相關的錯誤/警告消息-您所要做的就是將值傳遞給’skip’。

筆記2:使用’-exclude-dir =[DIR]’從遞歸搜索中排除與模式DIR匹配的目錄的選項。

18 grep如何終止具有空字符的文件名

如前所述,如果您希望該工具在輸出中僅顯示文件名,請使用grep -l命令行選項。例如:

Grep空文件結尾

您需要在這裡知道的是,以上輸出中的每個名稱都由換行符分隔。這是檢查方法:

將輸出重定向到文件並打印文件的內容。

Grep -l開關

因此,cat命令的輸出確認文件名之間存在換行符。

但是,您可能已經知道,換行符也可以是文件名的一部分。因此,如果處理包含換行符並由換行符分隔的文件名(特別是如果您從腳本訪問輸出),則使用grep輸出可能會很困難。

當分隔符/終止符不是換行符時適用。好吧,我很高興知道grep有一個命令行選項-Z,它使我可以看到文件名,後跟一個空字符而不是換行符。

因此,在這種情況下,命令將是:

grep -lZ "how" *.txt

要檢查是否存在空字符:

檢查空字符

以下是您應該了解的相關命令行選項。

 -z, --null-dataTreat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) insteadof a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.

19其他GREP命令示例

您可以在第二篇GREP命令教程中找到有關如何使用此Linux命令的更多示例。

  • 如何使用Grep對文件執行模式搜索
Sidebar