Linux/UNIX中的Grep命令

什麼是Grep

Grep,縮寫為“全球正則表達式打印”,是一個用於在包含正則表達式的文件中搜索和匹配文本模式的命令。此外,該命令在每個Linux發行版中都預先安裝。在本指南中,我們將查看最常見的grep命令用法,以及常見的用例。

Linux中的Grep命令

Grep命令可用於在文本文件中查找或搜索正則表達式或字符串。為了演示這一點,讓我們創建一個文本文件welcome.txt,並添加一些內容如下。

Welcome to Linux !
Linux is a free and opensource Operating system that is mostly used by
developers and in production servers for hosting crucial components such as web
and database servers. Linux has also made a name for itself in PCs.
Beginners looking to experiment with Linux can get started with friendlier linux
distributions such as Ubuntu, Mint, Fedora and Elementary OS.

太好了!現在我們準備執行一些grep命令,並操縱輸出以獲得所需的結果。要在文件中搜索字符串,運行以下命令語法

$ grep "string" file name

$ filename grep "string"

示例:

$ grep "Linux" welcome.txt

輸出 如您所見,grep不僅搜索並匹配了字符串“Linux”,還打印了字符串出現的行。如果文件位於不同的文件路徑中,請務必指定文件路徑,如下所示。

$ grep "string" /path/to/file

使用–color选项为Grep结果着色

如果您在不显示搜索字符串或模式与其他文本不同颜色的系统上工作,请使用--color使结果突出显示。示例

$ grep --color "free and opensource" welcome.txt 

输出

在所有目录中递归搜索字符串

如果您希望在当前目录和所有子目录中搜索字符串,请使用如下所示的-r标志进行搜索

$ grep -r "string-name" *

例如

$ grep -r "linux" *

输出

忽略大小写敏感性

在上面的例子中,我們的搜索結果給了我們我們想要的,因為字串“Linux”是以大寫指定的,並且在文件中也以大寫存在。現在讓我們試著搜索小寫字串。

$ grep "linux" file name

輸出中沒有任何內容,對吧?這是因為 grepping 找不到並匹配字符串“linux”,因為第一個字母是小寫。要忽略大小寫,請使用 -i 標誌,並執行以下命令

$ grep -i "linux" welcome.txt

輸出 真棒,對吧? 通常使用 - i 來顯示字符串,而不管它們的大小寫。

使用 -c 選項來計算匹配字符串的行數

要計算字符串模式出現或所在的總行數,請執行以下命令

$ grep -c "Linux" welcome.txt

輸出

使用 Grep 反轉輸出

為了反轉 Grep 的輸出,請使用 -v 標誌。 -v 選項指示 grep 列印所有不包含或不匹配表達式的行。 -v 選項告訴 grep 反轉其輸出,這意味著不是列印匹配行,而是做相反的事情並列印所有不匹配表達式的行。 回到我們的文件,讓我們像所示一樣顯示行號。在 Vim 編輯器上按 ESC,然後輸入完整冒號後面

 set nu

,然後按 Enter 輸出 現在,要顯示不包含字符串“Linux”的行,運行

$ grep -v "Linux" welcome.txt

輸出 如您所見,grep 已經顯示了不包含搜索模式的行。

使用 -n 選項對包含搜索模式的行進行編號

要對匹配字符串模式的行進行編號,請使用如下所示的 -n 選項

$ grep -n "Linux" welcome.txt

輸出

使用 -w 選項搜索精確匹配單詞

通過添加 -w 標誌將搜索包含完全匹配單詞的行,如下所示

$ grep -w "opensource" welcome.txt

輸出 但是,如果您嘗試

$ grep -w "open" welcome.txt

不會返回任何結果,因為我們不是在搜索模式,而是在搜索精確單詞!

使用管道與 grep

grep 命令可以與管道一起使用以獲得不同的輸出。例如,如果您想知道 Ubuntu 系統中是否安裝了某個包,請執行

$ dpkg -L | grep "package-name"

例如,要查找您的系統中是否已安裝 OpenSSH,請將 dpkg -l 命令作為管道傳遞給 grep,如下所示

$ dpkg -L | grep -i "openssh"

輸出

使用管道顯示搜索模式之前或之後的行數

您可以使用-A-B來顯示搜索字符串之前或之後的行數。-A標誌表示出現在搜索字符串之後的行,-B則打印出現在搜索字符串之前的輸出。例如

$ ifconfig | grep -A 4 ens3

此命令顯示包含字符串以及在ifconfig命令中的ens字符串之後的4行文字。 輸出 相反,在下面的示例中,使用-B標誌將在ifconfig命令中顯示包含搜索字符串以及在ether字符串之前的3行文字。 輸出

$ ifconfig | grep -B 4 ether

使用帶有REGEX的grep – 正則表達式

REGEX一詞是正則表達式的縮寫,正則表達式是一系列用於匹配模式的字符序列。以下是一些示例:

^      Matches characters at the beginning of a line
$      Matches characters at the end of a line
"."    Matches any character
[a-z]  Matches any characters between A and Z
[^ ..] Matches anything apart from what is contained in the brackets

範例 要打印以特定字符開頭的行,語法如下:

grep ^character file_name

例如,要顯示以字母“d”開頭的行,我們會執行在我們的 welcome.txt 文件中

$ grep ^d welcome.txt 

輸出 要顯示以字母“x”結尾的行,運行

$ grep x$ welcome.txt

輸出

使用更多 Grep 選項獲得幫助

如果您需要了解更多關於 Grep 命令的使用方法,執行以下命令以獲取其他可能與該命令一起使用的標誌或選項的 sneak 預覽。

$ grep --help

示例輸出 我們感謝您閱讀本教程的時間。請隨時嘗試執行命令,並告訴我們效果如何。

Source:
https://www.digitalocean.com/community/tutorials/grep-command-in-linux-unix