Linux Grep 命令的 12 個實用示例

你是否曾經面臨過在檔案中尋找特定字串或模式的任務,卻不知道從哪裡開始尋找?那麼,這裡就有拯救的grep指令

grep是一個強大的檔案模式搜尋工具,它在每個Linux發行版上都預先安裝。如果由於某種原因,它沒有安裝在您的系統上,您可以按照以下步驟通過套件管理器輕鬆安裝它。

$ sudo apt install grep         [On Debian, Ubuntu and Mint]
$ sudo yum install grep         [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux]
$ sudo emerge -a sys-apps/grep  [On Gentoo Linux]
$ sudo apk add grep             [On Alpine Linux]
$ sudo pacman -S grep           [On Arch Linux]
$ sudo zypper install grep      [On OpenSUSE]    

I have found that the easiest way to get your feet wet with the grep command is to just dive right in and use some real-world examples.

1. 在Linux中搜尋和尋找檔案

假設您剛在您的機器上安裝了新的Ubuntu系統,並且您打算嘗試Python腳本編寫。

您一直在網上尋找教程,但您發現有兩個不同版本的Python在使用中,您不知道安裝程式安裝了哪個版本的Python在Ubuntu上,或者是否安裝了任何模組。

只需執行以下帶有dpkg指令grep的命令,如下所示:

dpkg -l | grep -i python
Finding Files with Grep Command

首先,我們運行dpkg –l,這會列出系統上安裝的*.deb套件。其次,我們將該輸出導向到grep -i python,這僅僅是說“轉到grep並過濾並返回所有包含‘python’的內容。”

選項-i用於忽略大小寫,因為grep區分大小寫。使用-i選項是一種良好的習慣,除非您當然是在嘗試確定更具體的搜索。

2. 在Linux中搜索和過濾文件

grep也可以用於在單個文件或多個文件中搜索和過濾。讓我們看看這個場景:

您在使用您的Apache Web Server時遇到了一些問題,並且您已經在網上的眾多出色論壇中尋求幫助。

回答您的善良的人已經要求您發布您的/etc/apache2/apache2.conf文件的內容。如果您能刪除所有註釋行,那對您、幫助您的人以及閱讀它的每個人來說會更容易嗎?好吧,您可以!只需運行這個:

grep -v ^\# /etc/apache2/apache2.conf | grep .

選項-v告訴grep對其輸出進行反向操作,這意味著不打印匹配的行,而是相反地打印不匹配表達式的所有行,在這種情況下是#註釋行。

請注意,我們還在最後使用了grep .,以隱藏所有空行的輸出。這樣我們只在終端中看到配置設置。

Print Uncommented Lines in Linux

3. 在Linux中查找所有.mp3文件

grep 在从 stdout 中过滤信息时非常有用。例如,假设您有一个包含各种不同格式音乐文件的整个文件夹。

您想要找到所有来自艺术家 JayZ*.mp3 文件,但不想要任何混音曲目。使用一条带有一些 find 命令 的管道将完成这项任务:

# find . -name “*.mp3” | grep –i JayZ | grep –vi “remix”

在此示例中,我们使用 find 打印所有带有 *.mp3 扩展名的文件,将其传输到 grep –i 过滤并打印所有名称为 “JayZ” 的文件,然后另一个管道传输到 grep –vi,该命令过滤并不打印所有包含字符串(无论大小写) “remix” 的文件名。

[ 您可能还喜欢: Linux Find 命令的 35 个实用示例 ]

4. 显示搜索字符串之前或之后的行数

另外还有两个选项是 -A-B 开关,它们显示匹配行以及搜索字符串之前或之后的行数。

雖然手冊提供了更詳細的解釋,但我發現最容易記住的選項是-A = 之後-B = 之前

ifconfig | grep -A 4 inet
ifconfig | grep -B 2 UP
Print Number of Lines Before and After String

5. 打印匹配周圍的行數

grep的-C選項類似,但不是打印在字符串之前或之後的行,而是在任一方向上打印行:

# ifconfig | grep -C 2 lo

 TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 15314  bytes 1593769 (1.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0

6. 計算匹配的次數

類似於將grep字符串管道傳遞給字數計算(wc命令),grep的內置選項可以為您執行相同的操作:

# ifconfig | grep -c inet6

7. 在Linux中通過給定字符串搜索文件

在調試編譯錯誤時,grep–n選項非常有用。它顯示給定搜索字符串在文件中的行號:

# grep -n "main" setup.py

8. 在所有目錄中遞歸搜索字符串

如果您想在當前目錄以及所有子目錄中搜索字符串,可以指定–r選項進行遞歸搜索:

# grep -r “function” *

9. 搜索整個模式

-w選項傳遞給grep,可以搜索字符串中的整個模式。例如,使用:

# ifconfig | grep -w "RUNNING"

將打印包含引號中模式的行。另一方面,如果您嘗試:

# ifconfig | grep -w "RUN"
Find Entire Pattern

將不會返回任何內容,因為我們不是搜索模式,而是整個單詞。

10. 在Gzipped文件中搜索字符串

值得一提的是grep的衍生物。首先是zgrep,它类似于zcat,用于处理gzipped文件。它接受与grep相同的选项,并且使用方式相同:

# zgrep -i error /var/log/syslog.2.gz
Search String in Gzipped Files

11. 在文件中匹配正则表达式

egrep命令是另一个衍生物,代表“扩展全局正则表达式”。它识别附加的表达式元字符,如at + ? |()

egrep命令非常有用,用于搜索源文件和其他代码片段,如果有需要的话。它可以通过指定-E选项从常规grep中调用。

grep -E

12. 搜索固定模式字符串

fgrep命令在文件或文件列表中搜索固定模式字符串。它与grep -F相同。使用fgrep的常见方法是向其传递模式文件:

fgrep –f file_full_of_patterns.txt file_to_search.txt

這只是一個以 grep 為起點的開始,但正如您可能已經看到的那樣,它在各種情況下都是無價的。除了我們已實施的簡單單行命令外,grep 可用於撰寫強大的 cron 任務和堅固的 shell scripts,只是開始。

請發揮創意,嘗試 man page 上的選項,並想出符合您自己目的的 grep expressions

Source:
https://www.tecmint.com/12-practical-examples-of-linux-grep-command/