探索:Linux中強大的文本搜索命令----grep

這兩天在看日誌管理相關的資料,接觸過日誌的同學都知道,日誌內容紛繁複雜,爲了排查bug,後臺總是儘可能地打印所有與代碼運行有關的信息,看起來頭疼,但是通過一個強大的文本搜索命令,完美的解決了我的疑惑,這條命令即-grep(Global regular expression print),表示全局正則表達式打印。

grep命令用於查找文件裏符合條件的字符串,使用語法如下:
grep [-acinv] [--color=auto] '要查找的字符串' filename

我們通過實操演示環節來學習grep的各種用法,首先將/etc下的文件man.conf複製到/var下方便操作,先來看下該文件的大體結構。
在這裏插入圖片描述
這是其中的一部分內容。
稍微關注一下就可以發現,文本內容中出現最多的字符是含man的語句(包含大小寫以及截取段),所以接下來主要以man作爲要查找的字符進行演示。

第一條命令是統計man.conf文件中字符man出現的次數,可以看到統計結果爲:62。

[192:var apple$ grep -o man man.conf | wc -l
​      62

語法:grep -o 被統計的字符 統計文件主體 | wc -l

第二條命令開始簡單統計字符man在文件中出現的行:

[192:var apple$ grep [-n] 'man' man.conf 

上述命令中-n是可選,熟悉基本命令的同學都知道-n是顯示行數,結果如下(爲了不佔用篇幅,省去大部分結果,可以看到加了-n之後每行開頭加了行數進行提示):

2:# Generated automatically from man.conf.in by the
5:# man.conf from man-1.6g
7:# For more information about this file, see the man pages man(1)
...
...
96:JNROFF    /usr/bin/groff -Tnippon -mandocj -c
...
...
129:# Note that some systems have /usr/man/allman, causing pages to be shown twice.
134:# The command given must act as a filter

接下來解釋部分實用的參數:

-c:僅輸出匹配行的計數
-i:不區分大小寫
-h:查詢多文件時不顯示文件名
-l:查詢多文件時只輸出包含匹配字符的文件名
-n:顯示匹配行及行號
-s:不顯示不存在或無匹配文本的錯誤信息
-v:顯示不包含匹配文本的所有行
--color=auto :可以將找到的關鍵詞部分加上顏色的顯示

上述命令是可以一起執行的:

[192:var apple$ grep -ci 'man' man.conf 
58
#打印不區分大小寫含man字符的行數總和

注意:使用grep查找字符時,被查找的字符可以使用單引號,也可以不使用
grep還可以查找多個文件的字符;

#先將man.conf文件複製一份命名爲woman.txt
[192:var apple$ sudo cp man.conf /var/woman.txt

在兩個文件中查找man字符:篇幅有限,只顯示總行數

[192:var apple$ grep -ic man man.conf woman.txt 
 man.conf:58
 woman.txt:58
 #可以看到經過複製的文本,各有58行

語法:

grep [options] 被統計的字符 文本1 文本2 文本3 ...

一般在批量日誌查詢的時候,文件名的前綴或者後綴都是相同的,這樣就可以使用正則:
複製man.conf爲women.conf
在這裏插入圖片描述
查找當前路徑中以conf結尾的文件中man的行數:

[192:var apple$ grep -ic man *.conf
man.conf:58
woman.conf:58

查找當前路徑以wom開始的文件中man的行數:

[192:var apple$ grep -ic man wom*
woman.conf:58
woman.txt:58

不僅文件名可以正則表示,要查找的字符串同樣可以正則:查找文件中m*n的行數:

[192:var apple$ grep -ic m*n wom*
woman.conf:99
woman.txt:99
#查找當前目錄中以wom開頭的文件中包含m*n字符的行數

對於字符的正則常在日誌中查找固定時間段的日誌中非常便捷如:

#查找2020年4月的最後10天的日誌內容
grep -n '2020-04-2* 00:01:11' *.log

前面各個例子是查找並打印出符合條件的行,通過"-v"參數可以打印出不符合條件行的內容,篇幅限制還是隻統計行數:

[192:var apple$ grep -vc m*n wom*
woman.conf:50
woman.txt:50

注意,在正則表達式中:

. 代表絕對有一個字符的意思

* 代表重複前一個字符0到無窮多次的意思,爲組合形態

最後是關於顏色的顯示:

[appledeair-5:var apple$ grep --color=auto man man.conf 

在這裏插入圖片描述
關於grep的使用,正則表達式的靈活應用必不可少,比如:

grep -n 'm[ae]n' man.conf
#在man.conf中查找man或者men字符串所在的行
grep -n '[^wo]man' man.conf
#在man.conf中查找前面沒有wo字符的man字符串所在的行
grep -n [0-9] man.conf
#在man.conf中查找裏面含有數字的行
grep -n '^[A-Z]' man.conf
#在man.conf中查找開頭是大寫字母的行
grep -n ^[^a-zA-Z] man.conf
#在man.conf中查找開頭不是字母的行

目前爲止,關於grep的簡單總結將告一段落,其實這只是grep強大作用的冰山一角,但是已經可以涵蓋平時工作學習的百分之八十,有興趣可以接着探索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章