grep, egrep, fgrep -
列印匹配給定模式的行
總覽 SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f
FILE] [FILE...]
描述 DESCRIPTION
Grep 搜尋以 FILE
命名的檔案輸入
(或者是標準輸入,如果沒有指定檔名,或者給出的檔名是
-
的話),尋找含有與給定的模式
PATTERN
相匹配的內容的行。
預設情況下, grep
將把含有匹配內容的行打印出來。
另外,也可以使用兩個變種程式
egrep 和 fgrep 。 Egrep 與
grep -E 相同。 Fgrep 與
grep -F 相同。
選項 OPTIONS
- -A NUM,
--after-context=NUM
- 打印出緊隨匹配的行之後的下文
NUM
行。在相鄰的匹配組之間將會列印內容是
-- 的一行。
- -a, --text
- 將一個二進位制檔案視為一個文字檔案來處理;它與
--binary-files=text 選項等價。
- -B NUM,
--before-context=NUM
- 打印出匹配的行之前的上文
NUM
行。在相鄰的匹配組之間將會列印內容是
-- 的一行。
- -C NUM,
--context=NUM
- 打印出匹配的行的上下文前後各
NUM
行。在相鄰的匹配組之間將會列印內容是
-- 的一行。
- -b,
--byte-offset
- 在輸出的每行前面同時打印出當前行在輸入檔案中的位元組偏移量。
- --binary-files=TYPE
- 如果一個檔案的起始幾個位元組表明檔案包含二進位制資料,那麼假定檔案是
TYPE
型別的。預設情況下,
TYPE 是 binary ,並且 grep
一般會輸出一個一行的訊息說一個二進位制檔案匹配,或者如果沒有匹配的話就沒有訊息輸出。如果型別
TYPE 是 without-match ,那麼
grep
假定二進位制檔案不會匹配;這樣做與
-I
選項等價。如果型別
TYPE 是 text ,那麼 grep
將一個二進位制檔案視為文字檔案來處理;它與
-a 選項等價。
警告: grep --binary-files=text
可能會輸出二進位制的無用內容。如果輸出裝置是一個終端,並且終端的驅動將這些輸出中的一些當作命令,可能會帶來惡劣的副作用。
- --colour[=WHEN],
--color[=WHEN]
- 在匹配的行周圍以
GREP_COLOR
環境變數中指定的記號來標記。WHEN
可以是 `never', `always', 或是
`auto'。
- -c, --count
- 禁止通常的輸出;作為替代,為每一個輸入檔案列印一個匹配的行的總數。如果使用
-v, --invert-match 選項
(參見下面),將是不匹配的行的總數。
- -D ACTION,
--devices=ACTION
- 如果輸入檔案是一個裝置,FIFO
或是套接字 (socket)
,使用動作 ACTION
來處理它。預設情況下,動作
ACTION 是 read
,意味著裝置將視為普通檔案那樣來讀。如果動作
ACTION 是 skip
,將不處理而直接跳過裝置。
- -d ACTION,
--directories=ACTION
- 如果輸入檔案是一個目錄,使用動作
ACTION
來處理它。預設情況下,動作
ACTION 是 read
,意味著目錄將視為普通檔案那樣來讀。如果動作
ACTION 是 skip
,將不處理而直接跳過目錄。如果動作
ACTION 是 recurse , grep
將遞迴地讀每一目錄下的所有檔案。這樣做和
-r 選項等價。
- -E,
--extended-regexp
- 將模式 PATTERN
作為一個擴充套件的正則表示式來解釋
(參見下面)。
- -e PATTERN,
--regexp=PATTERN
- 使用模式 PATTERN
作為模式;在保護以
-
為起始的模式時有用。
- -F,
--fixed-strings
- 將模式 PATTERN
視為一個固定的字串的列表,用新行
(newlines)
分隔,只要匹配其中之一即可。
- -P,
--perl-regexp
- 將模式 PATTERN 作為一個
Perl
正則表示式來解釋。
- -f FILE,
--file=FILE
- 從檔案 FILE
中獲取模式,每行一個。空檔案含有0個模式,因此不匹配任何東西。
- -G,
--basic-regexp
- 將模式 PATTERN
作為一個基本的正則表示式
(參見下面)
來解釋。這是預設值。
- -H,
--with-filename
- 為每個匹配列印檔名。
- -h,
--no-filename
- 當搜尋多個檔案時,禁止在輸出的前面加上檔名字首。
- --help
- 輸出一個簡短的幫助資訊。
- -I
- 處理一個二進位制檔案,但是認為它不包含匹配的內容。這和
--binary-files=without-match
選項等價。
- -i,
--ignore-case
- 忽略模式 PATTERN
和輸入檔案中的大小寫的分別。
- -L,
--files-without-match
- 禁止通常的輸出;作為替代,打印出每個在通常情況下不會產生輸出的輸入檔案的名字。對每個檔案的掃描在遇到第一個匹配的時候就會停止。
- -l,
--files-with-matches
- 禁止通常的輸出;作為替代,打印出每個在通常情況下會產生輸出的輸入檔案的名字。對每個檔案的掃描在遇到第一個匹配的時候就會停止。
- -m NUM,
--max-count=NUM
- 在找到 NUM
個匹配的行之後,不再讀這個檔案。如果輸入是來自一個普通檔案的標準輸入,並且已經輸出了
NUM 個匹配的行, grep
保證標準輸入被定位於退出時的最後一次匹配的行之後,不管是否指定了要輸出緊隨的下文的行。這樣可以使一個呼叫程式恢復搜尋。當
grep 在 NUM
個匹配的行之後停止,它會輸出任何緊隨的下文的行。當使用了
-c 或 --count
選項的時候, grep
不會輸出比 NUM
更多的行。當指定了
-v 或 --invert-match
選項的時候, grep
會在輸出 NUM
個不匹配的行之後停止。
- --mmap
- 如果可能的話,使用
mmap(2)
系統呼叫來讀取輸入,而不是預設的
read(2)
系統呼叫。在一些情況下,
--mmap
提供較好的效能。但是,如果一個輸入檔案在
grep
正在操作時大小發生變化,或者如果發生了一個
I/O 錯誤, --mmap
可能導致不可知的行為
(包括core dumps)。
- -n,
--line-number
- 在輸出的每行前面加上它所在的檔案中它的行號。
- -o,
--only-matching
- 只顯示匹配的行中與
PATTERN
相匹配的部分。
- --label=LABEL
- 將實際上來自標準輸入的輸入視為來自輸入檔案
LABEL 。這對於 zgrep
這樣的工具非常有用,例如:
gzip -cd foo.gz |grep --label=foo something
- --line-buffering
- 使用行緩衝,it can be a performance
penality.
- -q, --quiet,
--silent
- 安靜。不向標準輸出寫任何東西。如果找到任何匹配的內容就立即以狀態值
0
退出,即使檢測到了錯誤。
參見 -s 或 --no-messages
選項。
- -R, -r,
--recursive
- 遞迴地讀每一目錄下的所有檔案。這樣做和
-d recurse 選項等價。
-
--include=PATTERN
- 僅僅在搜尋匹配 PATTERN
的檔案時在目錄中遞迴搜尋。
-
--exclude=PATTERN
- 在目錄中遞迴搜尋,但是跳過匹配
PATTERN 的檔案。
- -s,
--no-messages
- 禁止輸出關於檔案不存在或不可讀的錯誤資訊。
對於可移植性需要注意:與
GNU grep 不同,傳統的
grep 不遵守 POSIX.2
規範,因為傳統的
grep 缺少一個 -q
選項,而它的 -s
選項與 GNU grep 的 -q
選項行為相似。需要可移植到傳統
grep 的 shell
指令碼應當避免使用
-q 和 -s
選項,而應當將輸出重定向到
/dev/null 。
- -U, --binary
- 將檔案視為二進位制。預設情況下,在
MS-DOS 和 MS-Windows 系統中, grep
透過從檔案中讀取頭部的
32kB
內容來判斷它的檔案型別。如果
grep
判斷檔案是一個文字檔案,它將原始檔案內容中的
CR 字元去除 (使得含有
^ 和 $
的正則表示式可以正常工作)。指定
-U
將不進行這些工作,而使所有檔案保持不變地讀取並傳遞給匹配機制。如果檔案是一個以
CR/LF
換行的文字檔案,這樣作將導致一些正則表示式失敗。這個選項在
MS-DOS 和 MS-Windows
之外的系統中無效。
- -u,
--unix-byte-offsets
- 報告 Unix
風格的位元組偏移量。這個開關使得
grep
報告位元組偏移量時,將檔案作為
Unix
風格的文字檔案看待,也就是說將
CR
字元去掉。這將產生與在一臺
Unix 主機上執行 grep
完全相同的結果。除非同時使用
-b
選項,否則這個選項無效。這個選項在
MS-DOS 和 MS-Windows
之外的系統中無效。
- -V, --version
- 向標準錯誤輸出列印
grep
的版本號。版本號應當包含在所有的
bug 報告中
(參見下面)。
- -v,
--invert-match
- 改變匹配的意義,只選擇不匹配的行。
- -w,
--word-regexp
- 只選擇含有能組成完整的詞的匹配的行。判斷方法是匹配的子字串必須是一行的開始,或者是在一個不可能是詞的組成的字元之後。與此相似,它必須是一行的結束,或者是在一個不可能是詞的組成的字元之前。詞的組成字元是字母,數字,還有下劃線。
- -x,
--line-regexp
- 只選擇能匹配完整一行的匹配。
- -y
- -i
的同義詞,廢棄不用。
- -Z, --null
- 輸出一個全零位元組
(ASCII 碼中的 NUL 字元)
而不是一般情況下輸出在檔名之後的字元。例如,
grep -lZ
在每個檔名之後輸出一個全零位元組而不是普通的新行符。這個選項使得輸出清楚明白,即使檔名的表示中包含特殊字元比如新行符。這個選項可以與命令
find -print0, perl -0, sort -z, 和 xargs
-0
一起使用,來處理任意的檔名,即使是那些含有新行符的檔名。
正則表示式 REGULAR EXPRESSIONS
一個正則表示式是一個描述了一個字串集合的模式。正則表示式的構造類似於算術表示式,使用各種各樣的運算子來將更小的表示式連在一起。
Grep
能理解兩種不同版本的正則表示式語法:“basic”
和 “extended”。在 GNU grep
中,兩種語法可以實現的功能是沒有區別的。在其他實現中,基本
(basic)
正則表示式表達能力要弱一點。下面的描述適用於擴充套件的
(extended)
正則表示式,它與基本正則表示式的區別會在最後做一個總結。
基本的構造塊是匹配單個字元的正則表示式。大部分字元,包括所有字母和數字,是匹配它們自身的正則表示式。任何具有特殊含義的元字元可以透過前置一個反斜槓來引用。(may
be quoted by preceding it with a backslash.)
方括號表示式 (bracket)
是一個字元序列,放在
[ 和 ]
當中。它匹配序列中的任何一個字元;如果序列中的第一個字元是脫字元
(caret) ^ 那麼它匹配
不在
序列中的任何一個字元。例如,正則表示式
[0123456789]
匹配任何一個數字。
在方括號表示式之中,一個
範圍表示式 (range)
由兩個字元組成,中間用一個連字元
(hyphen)
分隔。它匹配在這兩個字元之間的任何一個字元,使用本地化的序列順序和字符集。(that
sorts between the two characters,inclusive, using the locale's collating
sequence and character set.)
例如,在預設的 C
locale中, [a-d] 與 [abcd]
等價。典型的,許多
locale
將字元以字典順序排序,在這些
locale 中, [a-d] 不與 [abcd]
等價;例如它可能與
[aBbCcDd]
等價。要獲得傳統的對方括號表示式的解釋,可以設定環境變數
LC_ALL 值為 C 來使用 locale C
。
最後,在方括號表示式中有一些預定義的字元類,如下所示。它們的名字是自說明的,它們是
[:alnum:](字母和數字),
[:alpha:](字母), [:cntrl:](),
[:digit:](數字), [:graph:](),
[:lower:](小寫字母),
[:print:](可列印字元),
[:punct:](), [:space:](空格),
[:upper:](大寫字母), 和
[:xdigit:] 。例如, [[:alnum:]]
意思是 [0-9A-Za-z]
,但是後一種表示方法依賴於
locale C 和ASCII
字元編碼,而前一種是與
locale
和字符集無關的。(注意這些字元類名中的方括號也是符號名稱的一部分,必須包含在用來為序列定界的方括號之中。)
大多數元字元處於序列中時會失去它們的特殊意義。為了包含一個字面意義
(literal) 的 ]
,需要將它放在序列的最前。與此相似,為了包含一個字面意義
(literal) 的 ^
,需要將它放在除了序列最前之外的其他位置。最後,為了包含一個字面意義
(literal) 的 -
,需要將它放在序列最後。
句點符 (period) .
匹配任何一個字元。符號
\w 是 [[:alnum:]]
的同義詞, \W 是
[^[:alnum]] 的同義詞。
脫字元 (caret) ^
和美元標記 (dollar) $
分別是匹配一行的首部和尾部的空字串的元字元。符號
\< 和 \>
分別是匹配一個詞的首部和尾部的空字串的元字元。符號
\b 匹配一個詞邊緣 (edge)
的空字串,符號 \B
匹配 不
處於一個詞的邊緣的空字串。
一個正則表示式後面可以跟隨多種重複運算子之一。
- ?
- 先前的項是可選的,最多匹配一次。
- *
- 先前的項可以匹配零次或多次。
- +
- 先前的項可以匹配一次或多次。
- {n}
- 先前的項將匹配恰好
n 次。
- {n,}
- 先前的項可以匹配 n
或更多次。
- {n,m}
- 先前的項將匹配至少
n 詞,但是不會超過
m 次。
兩個正則表示式可以連線到一起;得出的正則表示式可以匹配任何由兩個分別匹配連線前的子表示式的子字串連線而成的字串。
兩個正則表示式可以用中綴運算子
|
聯合到一起,得出的正則表示式可以匹配任何匹配聯合前的任何一個子表示式的字串。
重複運算子的優先順序比連線高,接下來又比選擇的優先順序高。一個完整的子表示式可以用圓括號
(parentheses)
括住來超越這些優先順序規則。(to
override these precedence rules.)
反向引用 \n 中,
n
是一個數字,匹配正則表示式中,以第
n
個圓括號括住的子表示式已匹配的子字串。
在基本正則表示式中,元字元
?, +, {, |, (, 和 )
喪失了它們的特殊意義;作為替代,使用加反斜槓的
(backslash) 版本 \?, \+, \{, \|,
\(, 和 \) 。
傳統的 egrep
不支援元字元 {
,並且一些 egrep
的實現透過支援 \{
來代替它,因此可移植的指令碼應當避免
在 egrep 中使用 {
模式,應當使用 [{]
來匹配一個字面意義
(literal) 的 { 。
GNU egrep 透過假設如果
{ 處於 an invalid interval specification
的起始,就不是一個特殊字元,來支援傳統的用法。例如,shell
命令 egrep '{1'
將會搜尋這個兩字元的字串
{1
而不是報告在正則表示式中發生了語法錯誤。POSIX.2
允許這個行為,將其視為一個擴充套件,但是可移植的指令碼應當避免使用它。
環境變數 ENVIRONMENT VARIABLES
Grep
的行為受下列環境變數影響。
一個 locale LC_foo
是透過按下面的順序,
LC_ALL, LC_foo, LANG,
檢查這三個環境變數的取值而確定的。設定了的第一個變數指定了
locale。例如,如果 LC_ALL
沒有設定,但是 LC_MESSAGES
設定為 pt_BR
,那麼巴西的葡萄牙語
(Brazilian Portuguese) 將用作 LC_MESSAGES locale
的值。如果沒有設定這其中任何一個環境變數,或者沒有安裝所設定的
locale 目錄,或者如果 grep
沒有將國家和語言支援
(national language support (NLS))
編譯在內,將預設使用
locale C。
- GREP_OPTIONS
- 這個變數指定了將放在所有顯式指定的選項之前的預設選項。例如,如果
GREP_OPTIONS 是 '--binary-files=without-match
--directories=skip' 的話, grep
將像已經在任何顯式指定的選項之前指定了
--binary-files=without-match 和 --directories=skip
選項那樣來運作。選項以空白
(whitespace)
分隔。一個反斜槓
(backslash)
使得下一個字元轉義
(escape),因此可以用來指定一個含有空白或者反斜槓的選項。
- GREP_COLOR
- 指定用來高亮顯示的標記。
- LC_ALL,
LC_COLLATE, LANG
- 這些變數指定了 locale
LC_COLLATE
,決定了解釋類似
[a-z]
的範圍表示式時的序列順序
(collating sequence) 。
- LC_ALL,
LC_CTYPE, LANG
- 這些選項指定了 locale
LC_CTYPE
,決定了字元的型別,例如,哪些字元是空白
(whitespace) 。
- LC_ALL,
LC_MESSAGES, LANG
- 這些選項指定了 locale
LC_MESSAGES ,決定了 grep
的訊息使用的語言。預設的
locale C
使用美國英語的訊息。
- POSIXLY_CORRECT
- 如果設定了的話,
grep 將像 POSIX.2
要求的那樣來運作;否則,
grep 將像其他 GNU
程式一樣來運作。POSIX.2
要求檔名之後的選項必須視為檔名;預設情況下,這些選項被交換到運算元列表的前面,被當作選項來處理。同時,
POSIX.2
要求不可識別的選項在診斷訊息中表示為
“illegal”,但是既然它們沒有真正觸犯法律,因此預設情況下它們在診斷
(diagnose) 訊息中表示為
“invalid”。 POSIXLY_CORRECT
同時禁止了下面描述的
_N_GNU_nonoption_argv_flags_。
- _N_GNU_nonoption_argv_flags_
- (這裡 N 是 grep's
數字形式的程序ID。)
如果這個環境變數的值的第
i 個字元是 1
,那麼不將 grep 的第
i
個運算元視為一個選項,即使它看上去像。shell
可以將這個變數設定在它執行的每個命令的環境中,指定哪個運算元是檔名萬用字元擴充套件的結果,因此不應當被視為選項。這個行為只有在使用
GNU C
庫時有效,並且只有在
POSIXLY_CORRECT
沒有設定的時候。
診斷 DIAGNOSTICS
一般地,如果找到了選擇的行,退出時狀態值為0,否則為1。但是如果發生錯誤,退出時狀態值是2,除非指定了
-q 或 --quiet 或 --silent
選項,並且找到了選擇的行。
bug
報告的電子郵件地址是
bug-gnu-utils@gnu.org。
一定要在“Subject:”中帶有
“grep” 這個詞。
在 {n,m}
結構中重複次數過多會導致
grep
使用大量記憶體。另外,一些過分晦澀的正則表示式需要指數級的時間和空間,可能會導致
grep
耗盡所有記憶體。
向後引用 (backreferences)
非常慢,可能需要指數級的時間。
《中國linux論壇man手冊頁翻譯計劃》:
http://cmpp.linuxforum.net
跋
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh