grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
功能
grep
是一種強(qiáng)大的文本搜索工具攒盈,它能使用正則表達(dá)式搜索(指定文件中的)文本,并把匹配的行打印出來。
舉例
顯示測試文件 testFile
的內(nèi)容
$cat testFile
輸入之后,輸出如下:
hello, this is a file
this file used for test the
command of grep.
do you know?
yes yeeeeeees i knooooooww!
the west is
what is ves?
this is a world
which is tes good.
west tes
westeses
westeseses
west tesves
這就是我們要測試的文件的內(nèi)容。
在當(dāng)前目錄及子目錄所有文件中查找字符串 test
$grep -r 'test' *
輸入之后,輸出如下:
good/test2:this is a test for the
good/test2:test the string.
test2:grep test for
test2:used to test the
test3:grep test for
test3:used to test the
testFile:this file used for test the
這個(gè)應(yīng)該是最常使用的命令了。 -r
選項(xiàng)的意思就是遞歸搜索子目錄的意思。
查找 test
并給結(jié)果中匹配的字符串加上顏色
$grep --color 'test' *
這樣绊序,會把輸出結(jié)果中的所有匹配的 test
字符串標(biāo)上顏色。
要在當(dāng)前目錄下所有 .doc
文件中查找字符串 sort
$grep "sort" *.doc
顯示匹配得行數(shù)
$grep -c "we" testFile
輸入之后秽荞,輸出如下:
5
這樣骤公,顯示匹配 we
的行的數(shù)目。
顯示含有 we
字符的行扬跋,并打印行號
$grep -n "we" testFile
輸入之后阶捆,輸出如下:
6:the west is
10:west tes
11:westeses
12:westeseses
13:west tesves
這樣,會在輸出的結(jié)果的最左側(cè)打印匹配的行號胁住。
顯示不匹配 we
的行
$grep -v "we" testFile
輸入之后趁猴,輸出如下:
hello, this is a file
this file used for test the
command of grep.
do you know?
yes yeeeeeees i knooooooww!
what is ves?
this is a world
which is tes good.
這里 -v
選項(xiàng)表示顯示不匹配 we
的行。
忽略大小寫的匹配
$ls |grep -i 'file'
輸入之后彪见,輸出如下:
testFile
這樣儡司,添加了 -i
選項(xiàng),匹配 file
的時(shí)候余指,不會區(qū)分大小寫捕犬。
范圍的匹配
$grep 'h[ae]' testFile
輸入之后跷坝,輸出如下:
hello, this is a file
this file used for test the
the west is
what is ves?
這里匹配的或者是 ha
或者是 he
,若使用 [a,e]
這樣也包括 ‘,’ 逗號了碉碉。
僅顯示包含 test
匹配的文件
$grep -l 'test' *
輸入之后柴钻,輸出如下:
test2
test3
testFile
這里, -l
選項(xiàng)僅列出含有匹配字符串的文件垢粮。
顯示 ls -l
輸出內(nèi)容中贴届,以 d
開頭的行
$ls -l | grep '^d'
或
$ls -l |grep ^d
輸入之后,輸出如下:
drwxr-xr-x 2 vaqeteart member 4096 Jul 12 18:44 good
這里蜡吧, good
是一個(gè)目錄毫蚓。
顯示 ls -l
輸出內(nèi)容中,不以 d
開頭的行
$ls -l |grep '^[^d]'
輸入之后昔善,輸出如下:
total 16
-rw-r--r-- 1 vaqeteart member 7 Jul 12 18:42 2
-rw-r--r-- 1 vaqeteart member 114 Jul 12 18:42 test2
-rw-r--r-- 1 vaqeteart member 212 Jul 12 19:01 testFile
這里元潘,利用 [^]
來指定不包含的字符。
顯示所有以 t
開頭的文件中包含 test
的行
$grep 'test' t*
輸入之后君仆,輸出如下:
test2:grep test for
test2:used to test the
testFile:this file used for test the
這里翩概,冒號左側(cè)是對應(yīng)行的文件名。
顯示在 testFile
返咱, test2
文件中匹配 test
的行
$grep 'test' testFile test2
或
$grep test testFile test2
輸入之后钥庇,輸出如下:
testFile:this file used for test the
test2:grep test for
test2:used to test the
為保險(xiǎn)期間,后面最好在搜索的時(shí)候加上''.
顯示 testFile
中有至少5個(gè)連續(xù)小寫字符的字符串的行
$grep '[a-z]\{5\}' testFile
輸入之后咖摹,輸出如下:
hello, this is a file
command of grep.
yes yeeeeeees i knooooooww!
this is a world
which is tes good.
westeses
westeseses
west tesves
顯示 testFile
中有開頭為5個(gè)連續(xù)小寫字符的字符串的行
$grep '^[a-z]\{5,\}' testFile
輸入之后上沐,輸出如下:
hello, this is a file
command of grep.
which is tes good.
westeses
westeseses
顯示 testFile
中含有以 th
為開始的單詞的行
$grep '\<th'
輸入之后,輸出如下:
hello, this is a file
this file used for test the
the west is
this is a world
這里楞艾,以 th
為開始的單詞有: this
和 the
。
顯示 testFile
中含有以 st
結(jié)尾的單詞的行
$grep 'st\>' testFile
輸入之后龄广,輸出如下:
this file used for test the
the west is
west tes
west tesves
這里硫眯,以 st
結(jié)尾的單詞有 test
和 west
。
利用標(biāo)記的搜索
$ grep 'w\(es\)t t\1v\1' testFile
輸入之后择同,輸出如下:
west tesves
這里两入,根據(jù)正則表達(dá)式 \(\
括號內(nèi)的內(nèi)容 es
匹配之后會被標(biāo)記為1,這樣以后可以用 \1
來代替 es
了敲才。這里相當(dāng)于搜索: grep 'west tesves' testFile
裹纳。如果用 egrep
或 grep -E
,就不用 \
號進(jìn)行轉(zhuǎn)義可以直接用1這個(gè)標(biāo)號了紧武。
描述
grep
是一種強(qiáng)大的文本搜索工具剃氧,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來阻星。
Unix
的 grep
家族包括 grep
朋鞍、 egrep
和 fgrep
。 egrep
和 fgrep
的命令只跟 grep
有很小不同。 egrep
是 grep
的擴(kuò)展滥酥,支持更多的 re
元字符更舞, fgrep
就是 fixed
grep
或 fast grep
,它們把所有的字母都看作單詞坎吻,也就是說缆蝉,正則表達(dá)式中的元字符表示回其自身的字面意義,不再特殊瘦真。
linux
使用 GNU
版本的 grep
刊头。它功能更強(qiáng),可以通過 -G
吗氏、 -E
芽偏、 -F
命令行選項(xiàng)來使用 egrep
和 fgrep
的功能。
grep
的工作方式是這樣的弦讽,它在一個(gè)或多個(gè)文件中搜索字符串模板污尉。如果模板包括空格,則必須被引用往产,模板后的所有字符串被看作文件名被碗。搜索的結(jié)果被送到屏幕,不影響原文件內(nèi)容仿村。
grep
可用于 shell
腳本锐朴,因?yàn)?grep
通過返回一個(gè)狀態(tài)值來說明搜索的狀態(tài),如果模板搜索成功蔼囊,則返回 0
焚志,如果搜索不成功,則返回 1
畏鼓,如果文件不存在酱酬,則返回 2
。我們利用這些返回值就可進(jìn)行一些自動化的文本處理工作云矫。
grep
的一些選項(xiàng):
-
-?
: 同時(shí)顯示匹配行上下的膳沽?行,如:grep -2 pattern filename
同時(shí)顯示匹配行的上下2行让禀。 -
-b挑社,--byte-offset
: 打印匹配行前面打印該行所在的塊號碼。 -
-c,--count
: 只打印匹配的行數(shù)巡揍,不顯示匹配的內(nèi)容痛阻。 -
-f File,--file=File
: 從文件中提取模板吼肥÷计剑空文件中包含0個(gè)模板麻车,所以什么都不匹配。 -
-h斗这,--no-filename
: 當(dāng)搜索多個(gè)文件時(shí)动猬,不顯示匹配文件名前綴。 -
-i表箭,--ignore-case
: 忽略大小寫差別赁咙。 -
-q,--quiet
: 取消顯示免钻,只返回退出狀態(tài)彼水。0則表示找到了匹配的行。 -
-l极舔,--files-with-matches
: 打印匹配模板的文件清單凤覆。 -
-L,--files-without-match
: 打印不匹配模板的文件清單拆魏。 -
-n盯桦,--line-number
: 在匹配的行前面打印行號。 -
-s渤刃,--silent
: 不顯示關(guān)于不存在或者無法讀取文件的錯(cuò)誤信息拥峦。 -
-v,--revert-match
: 反檢索卖子,只顯示不匹配的行略号。 -
-w,--word-regexp
: 如果被\<和\>引用洋闽,就把表達(dá)式做為一個(gè)單詞搜索玄柠。 -
-V,--version
: 顯示軟件版本信息诫舅。
其它
用于 grep
正則表達(dá)式的元字符集(基本集)
-
^
: 錨定行的開始 如:'^grep'匹配所有以grep開頭的行随闪。 -
$
: 錨定行的結(jié)束 如:'grep$'匹配所有以grep結(jié)尾的行。 -
.
: 匹配一個(gè)非換行符的字符 如:'gr.p'匹配gr后接一個(gè)任意字符骚勘,然后是p。 -
*
: 匹配零個(gè)或多個(gè)先前字符 如:'a*'匹配一個(gè)或多個(gè)a字符撮奏,'*grep'匹配一個(gè)或多個(gè)空格后緊跟grep俏讹。 -
.*
: 代表任意字符。 -
[]
: 匹配一個(gè)指定范圍內(nèi)的字符畜吊,如'[Gg]rep'匹配Grep和grep泽疆。 -
[^]
: 匹配一個(gè)不在指定范圍內(nèi)的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和H-Z范圍的一個(gè)字母開頭玲献,緊跟rep的行殉疼。 -
\(..\)
: 標(biāo)記匹配字符梯浪,如'(love)',love被標(biāo)記為1瓢娜,這樣如果同一表達(dá)式再引用love時(shí)挂洛,只需要利用\1即可。 -
\<
: 錨定單詞的開始眠砾,如:'\>' -
\>
:: 錨定單詞的結(jié)束虏劲,如'grep\>'匹配包含以grep結(jié)尾的單詞的行。 -
x\{m\}
: 重復(fù)字符x褒颈,m次柒巫,如:'o\{5\}'匹配包含5個(gè)o的行。 -
x\{m,\}
: 重復(fù)字符x,至少m次谷丸,如:'o\{5,\}'匹配至少有5個(gè)o的行堡掏。 -
x\{m,n\}
: 重復(fù)字符x,至少m次刨疼,不多于n次泉唁,如:'o\{5,10\}'匹配5–10個(gè)o的行。 -
\w
:: 匹配文字和數(shù)字字符币狠,也就是[A-Za-z0-9]游两,如:'G\w*p'匹配以G后跟零個(gè)或多個(gè)文字或數(shù)字字符,然后是p漩绵。 -
\W
: \w的反置形式贱案,匹配一個(gè)或多個(gè)非單詞字符,如點(diǎn)號句號等止吐。 -
\b
: 單詞鎖定符宝踪,如: '\bgrepb\'只匹配grep。
用于 egrep
和 grep -E
的元字符擴(kuò)展集
-
+
: 匹配一個(gè)或多個(gè)先前的字符碍扔。如:'[a-z]+able'瘩燥,匹配一個(gè)或多個(gè)小寫字母后跟able的串,如loveable,enable,disable等不同。 -
?
: 匹配零個(gè)或一個(gè)先前的字符厉膀。如:'gr?p'匹配g后跟一個(gè)或沒有r字符,然后是p的行二拐。 -
a|b|c
: 匹配a或b或c服鹅。如:grep|sed匹配grep或sed -
()
: 分組符號,如:love(able|rs)ov+匹配loveable或lovers百新,匹配一個(gè)或多個(gè)ov企软。 -
x{m},x{m,},x{m,n}
: 作用同x\{m\},x\{m,\},x\{m,n\}
POSIX字符類
為了在不同國家的字符編碼中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符類饭望,如"[:alnum:]"是A-Za-z0-9的另一個(gè)寫法仗哨。要把它們放到[]號內(nèi)才能成為正則表達(dá)式形庭,如[A- Za-z0-9]或[ [:alnum:] ]。在linux下的grep除fgrep外厌漂,都支持POSIX的字符類萨醒。
-
[:alnum:]
: 文字?jǐn)?shù)字字符 -
[:alpha:]
: 文字字符 -
[:digit:]
: 數(shù)字字符 -
[:graph:]
: 非空字符(非空格、控制字符) -
[:lower:]
: 小寫字符 -
[:cntrl:]
: 控制字符 -
[:print:]
: 非空字符(包括空格) -
[:punct:]
: 標(biāo)點(diǎn)符號 -
[:space:]
: 所有空白字符(新行桩卵,空格验靡,制表符) -
[:upper:]
: 大寫字符 -
[:xdigit:]
: 十六進(jìn)制數(shù)字(0-9,a-f雏节,A-F)