寫在前面
grep是一個(gè)最初用于Unix操作系統(tǒng)的命令行工具。在給出文件列表或標(biāo)準(zhǔn)輸入后,grep會(huì)對(duì)匹配一個(gè)或多個(gè)正則表達(dá)式的文本進(jìn)行搜索模闲,并只輸出匹配(或者不匹配)的行或文本攀唯。
grep這個(gè)應(yīng)用程序最早由肯·湯普遜寫成。grep原先是ed下的一個(gè)應(yīng)用程序媚朦,名稱來自于g/re/p(globally search a regular expression and print氧敢,以正規(guī)表示法進(jìn)行全局查找以及打印)询张。
本文并不打算詳細(xì)介紹grep的用法孙乖,因?yàn)?code>man grep會(huì)告訴你這些細(xì)節(jié),寫本文的初衷只是記錄一下自己學(xué)習(xí)linux命令行工具的過程份氧,以及歸納一些常見用法供自己查閱唯袄。
常用實(shí)例
grep的基本語(yǔ)法:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
以demo.txt為例
shell>cat demo.txt
THIS IS THE 1ST LINE
this is the 2nd line
This is the 3rd line
Two lines above this line is empty.
And this is the last line.
1. 在單文件中查找文本
這是最基本,也是最常用的用法蜗帜,如查找this
出現(xiàn)的行:
shell>grep 'this' demo.txt
this is the 2nd line
Two lines above this line is empty.
And this is the last line.
2. 忽略大小寫匹配文本
使用-i
參數(shù)恋拷,忽略(ignore)大小寫。
shell>grep -i 'this' demo.txt
THIS IS THE 1ST LINE
this is the 2nd line
This is the 3rd line
Two lines above this line is empty.
And this is the last line.
3.在多文件中匹配文本
比如厅缺,我們經(jīng)常會(huì)在工程中搜索某個(gè)類蔬顾、函數(shù)或結(jié)構(gòu)的定義,這里以beego工程目錄為例湘捎,我們要搜索Controller的定義:
shell>grep 'type Controller struct' *.go
controller.go:type Controller struct {
在controller.go文件中找到了Controller的定義诀豁。
4.遞歸目錄匹配文本
上面只是在當(dāng)前目錄下搜索多個(gè)文件,同樣的beego為例窥妇,我們想搜索Context在工程中的哪個(gè)定義中定義的, 使用-r
參數(shù)舷胜,遞歸查找目錄中的文件:
shell>grep -r 'type Context struct' ./
./context/context.go:type Context struct {
有時(shí)候匹配文件可能非常多,如果只想匹配的文本在在哪些文件中秩伞,可以通過指定-l
實(shí)現(xiàn)逞带,如:
shell>grep -r -l 'type Context struct' ./
./context/context.go
5.顯示匹配文本所在的行號(hào)
如果我們想知道上述例子中Context在context/context.go文件中的哪一行中定義的欺矫,可以通過-n
參數(shù)指定:
shell>grep -r -n 'type Context struct' ./
./context/context.go:59:type Context struct {
6.顯示匹配行上下文信息
仍然以查找Context為例,想查看匹配行后(After)5行的信息展氓,可以通過指定-A參數(shù)實(shí)現(xiàn)
shell>grep -r -n -A 5 'type Context struct' ./
./context/context.go:59:type Context struct {
./context/context.go-60- Input *BeegoInput
./context/context.go-61- Output *BeegoOutput
./context/context.go-62- Request *http.Request
./context/context.go-63- ResponseWriter *Response
./context/context.go-64- _xsrfToken string
同樣穆趴,想看前(Before)5行的信息,可以通過指定-B參數(shù)實(shí)現(xiàn)遇汞,如果想看匹配行前后5行的上下文(Context)信息未妹,可以通過指定-C參數(shù)實(shí)現(xiàn)。
7.在文件或標(biāo)準(zhǔn)輸入中查找不匹配的行
grep除了可以在文件中查找指定字符串或正則表達(dá)式外空入,還可以接受標(biāo)準(zhǔn)輸入络它,有時(shí)候可能想查找不匹配的行,可以通過-v參數(shù)指定歪赢。比如我們經(jīng)常會(huì)通過ps查找某個(gè)進(jìn)程是否存在化戳,比如看nginx進(jìn)程:
shell> ps -ef | grep nginx
dev 19638 18198 0 18:18 pts/1 00:00:00 grep nginx
dev 23770 1 0 Apr27 ? 00:00:00 nginx: master process nginx -p /home/dev/repos/itest/nginx/work/ -c conf/nginx.conf
dev 23771 23770 0 Apr27 ? 00:00:00 nginx: worker process
除了查找nginx進(jìn)程外,還有一個(gè)grep進(jìn)程在埋凯,這個(gè)時(shí)候我們可以通過管道再次用grep -v 'grep'把grep進(jìn)程過濾掉:
shell>ps -ef | grep nginx | grep -v 'grep'
dev 23770 1 0 Apr27 ? 00:00:00 nginx: master process nginx -p /home/dev/repos/itest/nginx/work/ -c conf/nginx.conf
dev 23771 23770 0 Apr27 ? 00:00:00 nginx: worker process
8.統(tǒng)計(jì)匹配行次數(shù)
可以通過指定-c
參數(shù)實(shí)現(xiàn)点楼,比如仍以demo.txt為例,想統(tǒng)計(jì)this
出現(xiàn)的行次數(shù):
shell>grep -c 'this' demo.txt
3
9.統(tǒng)計(jì)匹配文本的次數(shù)
仍然是demo.txt為例白对,我們統(tǒng)計(jì)單詞this
出現(xiàn)的次數(shù)掠廓,忽略大小寫,首先需要指定-o
參數(shù)查找匹配文本甩恼,再使用wc -l
進(jìn)行次數(shù)統(tǒng)計(jì):
shell>grep -o -i 'this' demo.txt | wc -l
5
10.高亮顯示匹配的文本
可以通過指定--color
參數(shù)實(shí)現(xiàn):
shell>grep -i 'this' --color demo.txt
小結(jié)
grep命令的用法是非常豐富的蟀瞧,其最強(qiáng)大的功能是通過與此正則表達(dá)式進(jìn)行匹配,但一涉及到正則表達(dá)式条摸,可能就引入一個(gè)新的問題——如果使用正則表達(dá)式悦污。上面的例子在日常工作中基本夠用,如果非要用到正常表式屈溉,使用一些簡(jiǎn)單的正則塞关,如^,$,.,*,+,?,[],|,{}
基本能滿足絕大部分應(yīng)用場(chǎng)景。
關(guān)于grep與正則表達(dá)式的一些常見用法子巾,后續(xù)單獨(dú)再寫篇進(jìn)行歸類總結(jié)帆赢。
基本用法參數(shù)小結(jié):
參數(shù) | 說明 |
---|---|
-i | 忽略大小寫 |
-r | 遞歸查找目錄中的文件進(jìn)行文本匹配 |
-l | 只顯示匹配文件所在的文件名 |
-n | 顯示匹配文件所在文件的行號(hào) |
-A NUM | 顯示匹配文本后NUM行 |
-B NUM | 顯示匹配文本前NUM行 |
-C NUM | 顯示匹配文本前后NUM行 |
-v | 反轉(zhuǎn)匹配,匹配不在指定文本的行 |
-o | 只顯示匹配的文本 |
-c | 統(tǒng)計(jì)匹配文本的行數(shù) |
--color | 高亮顯示匹配文本 |