Linux grep命令詳解


一、grep命令介紹

  很多時候,我們並不需要列出文件的全部內容,而是從文件中找到包含指定信息的那些行,要實現這個目的,可以使用 grep 命令。grep命令是一個強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。正則表達式是描述一組字符串的一個模式,正則表達式可以是一些純文本文字,也可以是用來產生模式的一些特殊字符。為了進一步定義一個搜索模式,grep 命令支持如下表所示的這幾種正則表達式的元字符(也就是通配符)。

通配符 功能
c* 將匹配 0 個或多個字符 c(c 為任一字符)
. 將匹配任何一個字符,且只能是一個字符
[xyz] 匹配方括號中的任意一個字符
[^xyz] 匹配除方括號中字符外的所有字符
^a 匹配以a開頭的行
$a 匹配以a結尾的行

grep 命令在每一個文件或特定輸出中搜索特定的模式,當使用 grep 時,會輸出跟指定模式匹配的每一行,但是使用 grep 命令並不改變文件中的內容。grep命令的基本格式如下:

[root@localhost ~]# grep [選項] 模式 文件名

這里的模式,要么是字符串,要么是正則表達式,而此命令常用的選項以及各自的含義如下表所示:

選項 含義
-c 僅列出文件中包含模式的行數
-i 忽略模式中的字母大小寫
-l 列出帶有匹配行的文件名,不列出具體的匹配行
-n 列出所有的匹配行,並顯示行號
-v 列出沒有匹配模式的行
-w 把表達式當做一個完整的單字符來搜尋,忽略那些部分匹配的行(匹配整詞)
-r 遞歸搜索

注意,如果是搜索多個文件,grep 命令的搜索結果會顯示文件名+匹配模式的行。

二、grep使用舉例

【例1】假設有一份 emp.data 員工清單,現在要搜索此文件,找出職位為 CLERK 的所有員工,則執行命令如下:

[root@localhost ~]# grep CLERK emp.data
#忽略輸出內容

而在此基礎上,如果只想知道職位為 CLERK 的員工的人數,可以使用“-c”選項,執行命令如下:

[root@localhost ~]# grep -c CLERK emp.data
#忽略輸出內容

【例2】搜索 emp.data 文件,使用正則表達式找出以 78 開頭的數據行,執行命令如下:

[root@localhost ~]# grep ^78 emp.data
#忽略輸出內容

 【例3】搜索data2.txt文件,搜索其中包含"data"的行,命令如下:

➜  test cat data2.txt
line1:This is the header line 1.
line2:This is the first data line 2.
line3:This is the second DATA line 3.
line4:This is the last line 4.

➜  test grep -inr data data2.txt
2:line2:This is the first data line 2.
3:line3:This is the second DATA line 3.
# -i 表示忽略大小寫,-n表示列出行號,-r表示遞歸搜索,-r會匹配當前目錄所有文件,以及子目錄下的所有文件

【例4】使用grep過濾命令輸出

➜  test ps -aux|grep systemd
root         246  0.2  0.2  95284 38520 ?        Ss   Jul07 319:31 /lib/systemd/systemd-journald
root         268  0.0  0.0  45696  3776 ?        Ss   Jul07   0:15 /lib/systemd/systemd-udevd
root         534  0.0  0.0  38084  4416 ?        Ss   Jul07   0:49 /lib/systemd/systemd-logind
message+     547  0.0  0.0  36684  3472 ?        Ss   Jul07   2:04 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root        1050  0.0  0.0  56540  6184 ?        Ss   Jul07   0:29 /lib/systemd/systemd --user
tiger       1051  0.0  0.0  56636  6348 ?        Ss   Jul07  93:05 /lib/systemd/systemd --user
falcon      1055  0.0  0.0  56516  6244 ?        Ss   Jul07   0:00 /lib/systemd/systemd --user
baichun+ 2981158  0.0  0.0  12756  1016 pts/1    S+   12:38   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox systemd
baichun+ 3906675  0.0  0.0  56404  6196 ?        Ss   Aug31   0:00 /lib/systemd/systemd --user

 【例5】用 dmesg 列出核心信息,再以 grep 找出包含 eth 那行,在關鍵字所在行的前兩行后三行也一起捉出來顯示

[root@www ~]# dmesg | grep -n -A3 -B2 'eth'
245-PCI: setting IRQ 10 as level-triggered
246-ACPI: PCI Interrupt 0000:00:0e.0[A] -> Link [LNKB] ...
247:eth0: RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84, IRQ 10
248:eth0: Identified 8139 chip type 'RTL-8139C'
249-input: PC Speaker as /class/input/input2
250-ACPI: PCI Interrupt 0000:00:01.4[B] -> Link [LNKB] ...
251-hdb: ATAPI 48X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048kB Cache, UDMA(66)
# 如上所示,你會發現關鍵字 247 所在的前兩行及 248 后三行也都被顯示出來!
# 這樣可以讓你將關鍵字前后數據捉出來進行分析啦
# -B2:Before前兩行 -A3:After后三行

【例6】遞歸查找文件內容

➜  test grep -rn bcy *             # 純字符串匹配,可以不加單引號,如果是正則表達式匹配,必須加單引號,如:grep -rn 'bcy' *
temp.txt:1:my name is bcy.
test.txt:2:smierrth,bcy
#在當前目錄及其子目錄下搜索包含'bcy'行的文件,*代表搜索全部文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM