grep命令中文手冊(info grep翻譯)

来源:http://www.cnblogs.com/f-ck-need-u/archive/2017/09/01/7462706.html
-Advertisement-
Play Games

1.本文為info man的譯文,基本按照原文翻譯,有幾個用不上的選項沒有翻譯,但為了文章的完整性,給出了原文。2.譯文中有些"(註:)",為本人自行加入,幫助理解和說明,非原文內容! 本人譯作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html ...


1.本文為info man的譯文,基本按照原文翻譯,有幾個用不上的選項沒有翻譯,但為了文章的完整性,給出了原文。
2.譯文中有些"(註:)",為本人自行加入,幫助理解和說明,非原文內容!

本人譯作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


本文目錄:

1 簡介
2 調用grep程式

2.1 命令行選項

2.1.1 一般選項
2.1.2 控制匹配模式
2.1.3 控制輸出內容
2.1.4 控制輸出行的首碼
2.1.5 控制輸出行的上下文
2.1.6 篩選文件和目錄
2.1.7 其他選項

2.2 退出狀態碼
2.3 各種grep程式

3 正則表達式

3.1 基本結構
3.2 字元類和中括弧表達式
3.3 反斜線字元和特殊的表達式
3.4 錨定
3.5 後向引用和子表達式
3.6 基礎正則和擴展正則的比較

4 使用示例
5 已知的一些Bug


1 Introduction


'grep'用於搜索給定文件中能匹配給定pattern列表的行。當某行能匹配上,(預設)將拷貝該行到標準輸出,或者根據你所指定的選項生成其它序列的輸出。

儘管'grep'所期望的是在文本行中做匹配,但即使某輸入行的大小長度超出了可用記憶體空間也不會受到限制,它仍可以匹配一行中任意字元串。如果輸入文件的最後一個位元組不是換行符,'grep'會自動補上一個。由於換行符也是pattern列表的分隔符,因此沒有任何辦法匹配文本中的換行符。

2 Invoking 'grep'


'grep'命令行的一般語法格式為:

grep OPTIONS PATTERN INPUT_FILE_NAMES

OPTIONS部分可以指定0或多個。只有當沒有使用"-e PATTERN"或"-f FILE"時,指定的PATTERN才被grep可視。可以指定0或多個INPUT_FILE_NAMES。

2.1 Command-line Options(命令行選項)

'grep'有大量選項可用:一些是POSIX.2中的,一些是GNU擴展的。長選項都是GNU擴展選項,即使它們來自於POSIX。由POSIX指定的短選項,被明確標註為便於POSIX可移植性編程。有少數幾個選項是為了相容古老版本的grep。 有幾個額外的選項用於控制使用哪種變體'grep'匹配引擎(註:fgrep/grep/egrep)。

2.1.1 Generic Program Information

'--help'
輸出簡短的grep命令行使用幫助並退出。

'-V'
'--version'
輸出'grep'的版本號。

2.1.2 Matching Control(控制匹配模式)

'-e PATTERN'
'--regexp=PATTERN'
明確指定使用此處的PATTERN作為待匹配的pattern。該選項可以指定多次,它可以保護以"-"開頭的pattern。('-e'是POSIX指定的選項。)

'-f FILE'
'--file=FILE'
從FILE中獲取pattern列表,每行一個pattern。空的FILE表示不給定任何pattern,所以不會匹配到任何內容。('-f'是POSIX指定的選項。)

'-i'
'-y'
'--ignore-case'
忽略PATTERN中的大小寫,也忽略輸入文件中的大小寫區別。'-y'是廢棄的用於和老版本保持相容性的選項。('-i'是POSIX指定的選項。)

'-v'
'--invert-match'
反轉匹配的結果,即選擇那些未匹配到的行。('-v'是POSIX指定的選項。)

'-w'
'--word-regexp'
僅選擇能精確匹配整個單詞的行。單詞的組成字元包括:字母、數字和下劃線。除了這些字元,其餘都是該選項篩選單詞時的單詞邊界分隔符。 (註:例如字元串"fstab fstab(5)",grep -w 'fstab'或grep -w 'fsta.'能匹配這兩個單詞,但grep -w 'fsta'無法匹配任意一個)

'-x'
'--line-regexp'
僅選擇能精確匹配整行內容的行。('-x'是POSIX指定的選項。)
(註:例如某行"abcde",grep -x 'abc'將無法匹配該行,而grep -x 'abcd.'能匹配該行)

2.1.3 General Output Control(控制輸出內容)

'-c'
'--count'
不再輸出匹配的內容,而是輸出匹配到的行數量。如果給定了"-v"選項,則輸出未匹配到的行數量。('-c'是POSIX指定的選項。)

'--color[=WHEN]'
'--colour[=WHEN]'
對匹配到的內容賦予顏色並輸出。WHEN的有效值包括:'never'、'always'或'auto'。

'-L'
'--files-without-match'
不再輸出匹配的內容,而是輸出未能被匹配到的文件名,當某文件中的某行被匹配到,將不再繼續向下搜索該文件。
(註:和"-l"輸出的文件名相反)

'-l'
'--files-with-matches'
不再輸出匹配的內容,而是輸出能被匹配到的文件名,當某文件中的某行被匹配到,將不再繼續向下搜索該文件。('-l'是POSIX指定的選項。)

'-m NUM'
'--max-count=NUM'
當匹配成功的行有NUM行時,停止讀取文件。如果是普通文件作為標準輸入,則輸出這匹配到的NUM行。grep會在最後一次匹配行後做位置標記,使得調用的另一個進程可以從此處恢復並繼續向下搜索。例如,下麵的shell腳本:

while grep -m 1 PATTERN
do
echo xxxx
done < FILE

而下麵的shell腳本則以不同於上面腳本方式運行,因為此處使用的是管道,這不是一個實體文件:

cat FILE |
while grep -m 1 PATTERN
do
echo xxxx
done

(註:如果對這兩個腳本有疑問,可參考while迴圈中的陷阱,該文章中解釋了管道和文件直接重定向時的區別)

'-o'
'--only-matching'
輸出被匹配到的字元串,而不是輸出整行。每個被匹配到的字元串都使用單獨的行輸出。

'-q'
'--quiet'
'--silent'
靜默模式,立即退出,即使遇到了錯誤。不寫任何內容到標準輸出。如果匹配到了內容則退出狀態碼為0。('-q'是POSIX指定的選項。)

'-s'
'--no-messages'
禁止輸出因文件不存在或文件沒有讀許可權而產生的錯誤信息。('-s'是POSIX指定的選項。)

(註:由於POSIX和GNU grep的差異性,在可移植性的腳本中,應儘量避免使用"-q"和"-s",而是使用重定向的方式重定向到/dev/null)

2.1.4 Output Line Prefix Control(控制輸出行的首碼)

當輸出行有首碼要輸出時,它們的順序總是:文件名、行號、位元組的偏移量,這個順序不會因為首碼控制選項的順序而改變。

'-b'
'--byte-offset'
Print the 0-based byte offset within the input file before each line of output. If '-o' ('--only-matching') is specified, print the offset of the matching part itself. When 'grep' runs on MS-DOS or MS-Windows, the printed byte offsets depend on whether the '-u' ('--unix-byte-offsets') option is used; see below.

'-H'
'--with-filename'
輸出匹配到內容所在文件的文件名。當指定了多個輸入文件時,這是預設的。

'-h'
'--no-filename'
禁止輸出文件名。當只有一個輸入文件時,這是預設的。

'--label=LABEL'
Display input actually coming from standard input as input coming from file LABEL. This is especially useful when implementing tools like 'zgrep'; e.g.:

gzip -cd foo.gz | grep --label=foo -H something

'-n'
'--line-number'
輸出匹配內容在文件中的行號,每個文件都單獨從1開始計數。('-n'是POSIX指定的選項。)

'-T'
'--initial-tab'
Make sure that the first character of actual line content lies on a tab stop, so that the alignment of tabs looks normal. This is useful with options that prefix their output to the actual content:'-H', '-n', and '-b'. In order to improve the probability that lines from a single file will all start at the same column, this also causes the line number and byte offset (if present) to be printed in a minimum-size field width.

'-u'
'--unix-byte-offsets'
Report Unix-style byte offsets. This option causes 'grep' to report byte offsets as if the file were a Unix-style text file, i.e., the byte offsets ignore the 'CR' characters that were stripped. This will produce results identical to running 'grep' on a Unix machine. This option has no effect unless the '-b' option is also used; it has no effect on platforms other than MS-DOS and MS-Windows.

'-Z'
'--null'
在輸出文件名時,使用"\0"放在文件名後,這會替換原本使用的字元,如換行符或冒號。例如"grep -lZ"輸出的每個文件都在同一行而不是分行,"grep -HZ"使得文件名後沒有冒號。

2.1.5 Context Line Control(控制輸出行的上下文)

無論下麵的選項如何設置,grep都不會多次輸出同一行。如果指定了"-o"選項,這些選項將失效,並給出一個警告。

'-A NUM'
'--after-context=NUM'
除了輸出匹配到的行,還輸出匹配到內容的後NUM行。

'-B NUM'
'--before-context=NUM'
除了輸出匹配到的行,還輸出匹配到內容的前NUM行。

'-C NUM'
'-NUM'
'--context=NUM'
除了輸出匹配到的行,還輸出匹配到內容的前NUM行和後NUM行。

'--group-separator=STRING'
當使用'-A', '-B' or '-C'時,使用STRING替代預設的組分隔符。

(註:組分隔符表示匹配到的內容的上下文。例如"-A 2",在某行匹配到時,還將輸出後兩行,這是一個組。下一次匹配成功時,如果是在該組之後行匹配上的,則這兩組中間預設使用"--"分隔)

'--no-group-separator'
當使用'-A', '-B' or '-C'時,不輸出任何組分隔符,而是將不同組相鄰輸出。

2.1.6 File and Directory Selection(文件和目錄的選擇)

'-a'
'--text'
Process a binary file as if it were text; this is equivalent to the '--binary-files=text' option.

'--binary-files=TYPE'
If the first few bytes of a file indicate that the file contains binary data, assume that the file is of type TYPE. By default, TYPE is 'binary', and 'grep' normally outputs either a one-line message saying that a binary file matches, or no message if there is no match. If TYPE is 'without-match', 'grep' assumes that a binary file does not match; this is equivalent to the '-I' option. If TYPE is 'text', 'grep' processes a binary file as if it were text; this is equivalent to the '-a' option. Warning: '--binary-files=text' might output binary garbage, which can have nasty side effects if the output is a terminal and if the terminal driver interprets some of it as commands.

'-D ACTION'
'--devices=ACTION'
If an input file is a device, FIFO, or socket, use ACTION to process it. By default, ACTION is 'read', which means that devices are read just as if they were ordinary files. If ACTION is 'skip', devices, FIFOs, and sockets are silently skipped.

'-d ACTION'
'--directories=ACTION'
If an input file is a directory, use ACTION to process it. By default, ACTION is 'read', which means that directories are read just as if they were ordinary files (some operating systems and file systems disallow this, and will cause 'grep' to print error messages for every directory or silently skip them). If ACTION is 'skip', directories are silently skipped. If ACTION is 'recurse', 'grep' reads all files under each directory, recursively; this is equivalent to the '-r' option.

'--exclude=GLOB'
忽略basename能被GLOB匹配到的文件。GLOB通配符包括:"*"、"?"和"[...]"。

'--exclude-from=FILE'
從FILE中讀取exclude的排除規則。

'--exclude-dir=DIR'
篩選出不進行遞歸搜索的目錄,使用DIR進行匹配。

'-I'
Process a binary file as if it did not contain matching data; this is equivalent to the '--binary-files=without-match' option.

'--include=GLOB'
只搜索basename能被GLOB匹配的文件。

'-r'
'-R'
'--recursive'
從命令行中給定的目錄中遞歸進去,搜索其中的每個文件和目錄。

2.1.7 Other Options(其他選項)

'--line-buffered'
Use line buffering on output. This can cause a performance penalty.

'--mmap'
This option is ignored for backwards compatibility. It used to read input with the 'mmap' system call, instead of the default 'read' system call. On modern systems, '--mmap' rarely if ever yields better performance.

'-U'
'--binary'
Treat the file(s) as binary. By default, under MS-DOS and MS-Windows, 'grep' guesses the file type by looking at the contents of the first 32kB read from the file. If 'grep' decides the file is a text file, it strips the 'CR' characters from the original file contents (to make regular expressions with '^' and '$' work correctly). Specifying '-U' overrules this guesswork, causing all files to be read and passed to the matching mechanism verbatim; if the file is a text file with 'CR/LF' pairs at the end of each line, this will cause some regular expressions to fail. This option has no effect on platforms other than MS-DOS and MS-Windows.

'-z'
'--null-data'
以"\0"作為輸入行的分隔符,而不再以換行符分隔兩行。
(註:這為grep提供了簡單的跨行匹配的能力。見後文示例14。)

2.2 Exit Status(退出狀態碼)

通常情況下,如果能匹配到內容,則退出狀態碼為0,否則為1。但是如果發生了錯誤,則退出狀態碼為2,除非使用了"-s"或"-q"選項。

2.3 'grep' Programs(各種grep程式)

有4種grep程式分別支持不同的搜索引擎,使用下麵4個選項可以選擇使用哪種grep程式。

'-G'
'--basic-regexp' 使用基礎正則表達式引擎解析PATTERN,因此只支持基礎正則表達式(BRE)。這是預設grep程式。

'-E'
'--extended-regexp'
使用擴展正則表達式引擎解析PATTERN,因此支持擴展正則表達式(ERE)。('-E'是POSIX指定的選項。)

'-F'
'--fixed-strings'
不識別正則表達式,而是使用字元的字面意義解析PATTERN,因此只支持固定字元串的精確匹配。('-F'是POSIX指定的選項。)

'-P'
'--perl-regexp'
使用perl正則表達式引擎解析PATTERN,因此支持Perl正則表達式。但該程式正處於研究測試階段,因此會給出一個警告。

此外,"grep -E"和"grep -F"可分別簡寫為egrep和fgrep。但這兩個簡寫程式是傳統寫法,已被廢棄,雖仍支持,但只是為了相容老版本程式。
(註:還有zgrep和pgrep,但它們不是grep家族的程式,zgrep是gzip提供,pgrep用於查看進程名和pid的映射關係)

3 Regular Expressions(正則表達式)


正則表達式是一種用於描述字元串集合的表達式。正則表達式類似於算術表達式,也使用各種操作符組合各短小表達式。grep可以理解三種不同版本的正則表達式:基礎正則表達式BRE、擴展正則表達式ERE和Perl正則表達式。下麵所描述的是擴展正則表達式的內容,在後文會比較BRE和ERE的不同之處。而Perl正則功能更完整、性能更好,可以從pcresyntax(3)和pcrepattern(3)中獲取詳細信息,但有些操作系統中可能無法獲取。

3.1 Fundamental Structure(基本結構)

基本結構塊是匹配單個字元的正則表達式。大多數字元,包括字母和數字,都能自己匹配自己,例如給定正則表達式"a",它能匹配字母a。所有的元字元都具有特殊意義,需要使用反斜線進行轉義。

正則表達式可以使用下麵幾種方式來表示重覆次數。

'.'
點"."可以匹配任意單個字元。

'?'
可以匹配前一個條目0或一次。例如,"ca?b"可以匹配"cb"也可以匹配到"cab",但不能匹配到"caab"。如果使用了分組,如"c(ca)?b"能匹配"cb"或"ccab"。

'*'
匹配前一個條目0或任意多次。

'+'
匹配前面的條目一次或多次。

'{N}'
匹配前面的條目正好N次。

'{N,}'
匹配前面的條目N次或更多次。即至少匹配N次。

'{,M}'
匹配前面的條目最多M次。即匹配0到M次。

'{N,M}'
匹配前面的條目N到M次。

兩個正則表達式可以進行串聯,串聯後的匹配結果是這兩個正則表達式的匹配結果進行的串聯。例如正則表達式"ab"就是"a"和"b"串聯後的正則。

兩個正則表達式還可以使用豎線符號"|"進行連接,這表示二者選一,只要能匹配豎線兩邊任意一個正在表達式均可,若能同時匹配上也可。例如字元串"acx"、"bx"、"accb"均能被正則表達式"ac|b"匹配上,其中"accb"被同時匹配上。

重覆次數的符號優先順序高於串聯高於二者選一符號"|",使用括弧可以改變優先順序規則。

3.2 Character Classes and Bracket Expressions(字元類和中括弧表達式)

中括弧正則表達式是使用"["和"]"包圍的字元列表。它能匹配該列表中的任意單個字元。如果列表中的第一個字元是"^",則表示不匹配該列表中的任意單個字元。例如,'[0123456789]'能匹配任意數字。

中括弧中可以使用連字元"-"連接兩個字元表示"範圍"。例如,C字元集下的"[a-d]"等價於"[abcd]"。大多數字元集規則和字典排序規則一樣,這意味著"[a-d]"不等價於"[abcd]",而是等價於"[aBbCcDd]"。可以設置環境變數"LC_ALL"的值為C使得採取C字元集的排序規則。

最後,預定義了幾個特定名稱的字元類,它們都使用中括弧包圍。如下:

'[:alnum:]'
匹配大小寫字母和數字。等價於字元類'[:alpha:]'與字元類'[:digit:]'的和。

'[:alpha:]'
字母字元類。匹配大小寫字母。等價於字元類'[:lower:]'和字元類'[:upper:]'的和。

'[:blank:]'
空白字元類。包括:空格和製表符。

'[:cntrl:]'
控制字元類。在ASCII中,這些字元的八進位代碼從000到037,還包括177(DEL)。

'[:digit:]'
數字字元類。包括:'0 1 2 3 4 5 6 7 8 9'。

'[:graph:]'
繪圖類。包括:大小寫字母、數字和標點符號。等價於

'[:lower:]'
小寫字母類。包括:'a b c d e f g h i j k l m n o p q r s t u v w x y z'。

'[:print:]'
列印字元類。包括:大小寫字母、數字、標點符號和空格。等價於字元類'[:alnum:]'與字元類'[:punct:]'和空格的和。

'[:punct:]'
標點符號類。包括:'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'。

'[:space:]'
空格字元類。包括:空格、製表符、垂直製表符、換行符、回車符和分頁符。

'[:upper:]'
大寫字母類。包括:'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'。

'[:xdigit:]'
十六進位類。包括:'0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'。

例如,"[[:alnum:]]"表示"[0-9A-Za-z]","[^[:digit:]]"表示[^0123456789],"[ABC[:digit:]]"表示"[ABC0-9]"。註意,字元類必須包含在額外的中括弧內。

中括弧中的大多數元字元都丟失了它們特殊意義,而成為普通的字面符號。

']'
該符號表示中括弧的結束。如果要匹配該字面字元,則必須將其放在字元列表的最前面。即"[]...]"。

'[.'
該符號表示排序符號的開始。
(註:排序類需要在字元集中預先定義好才能使用。例如[.ab.]表示將“ab”作為整體匹配,不匹配a或b。但預設情況下,字元集里肯定是沒有定義好"ab"這個排序整體的,所以無法使用)

'.]'
表示排序符號的結束。

'[='
表示等價類的開始。
(註:例如,[=e=]表示將字母e的第一聲和第三聲等不同音節的同字母看成相同字元。)

'=]'
表示等價類的結束。

'[:'
表示字元類的開始。

':]'
表示字元類的結束。

'-'
該字元是範圍連接符,因此要匹配該符號的字面意義,需要將其放在列表的最前面或最後面或作為範圍的結束字元。

'^'
該字元表示不在列表中的字元。如果想匹配該字元的字面意義,則必須不能放在列表的第一個字元。

3.3 The Backslash Character and Special Expressions(反斜線字元和特殊的表達式)

反斜線"\"後使用特定的字元表示特殊意義,如下:

'\b'
匹配單詞邊界處的空字元。 (註:grep中的單詞有數字、字母和下劃線組成,其他所有字元都是單詞的分隔符。)

'\B'
和"\b"相反,表示匹配非單詞邊界的空字元。

'\<'
匹配單詞起始位置處的空字元。

'\>'
匹配單詞結束位置處的空字元。

(註:所以\bWORD\b等價於\<word\>。另外,grep選項"-w"也表示匹配單詞邊界)

'\w'
匹配單詞成分的字元。是[_[:alnum:]]的同義詞。

'\W'
匹配非單詞成分的字元,是[^_[:alnum:]]的同義詞。

'\s'
匹配空白字元,是[[:space:]]的同義詞。

'\S'
匹配非空白字元,是[^[:space:]]的同義詞。

例如,"\brat\b"匹配被分割後的"rat","\Brat\B"匹配"crate"但不匹配"furry rat"。

3.4 Anchoring(錨定)

脫字元"^"以及美元符"$"是錨定元字元,分別匹配行首和行尾的空字元。

3.5 Back-references and Subexpressions(後向引用和子表達式)

反向引用"\N"表示匹配前面第N個括弧中的正則子表達式,其中N是單個數字。例如"(a)\1"表示"aa"。當使用二選一的操作符"|"時,如果分組不參與匹配過程,則後向引用將失敗。例如"a(.)|b\1"將無法匹配"ba"。 如果使用"-e"或"-f FILE"指定了多個PATTERN,則每個pattern的後向序列值都相互獨立。

(註:例如:'([ac])e\1|b([xyz])\2t'能匹配aea或cec,但不能匹配cea或aec,還能匹配bxxt或byyt或bzzt。但如果將"\2"換成"\1",即'([ac])e\1|b([xyz])\1t',將無法匹配b[xyz]at或b[xyz]ct,因為第一個括弧在左邊,無法參與右邊的正則搜索。

(註:反向引用也稱為後向引用或回溯引用)

3.6 Basic vs Extended Regular Expressions(基礎正則和擴展正則)

在基礎正則表達式中,元字元'?'、'+'、'{'、'|'、'(',和')'都表示字面意思,取而代之的是加上反斜線的版本:'\?'、'+'、'{'、'\|'、'('和')'。

4 Usage(使用示例)


以下是一些GNU grep的使用示例:

grep -i 'hello.*world' menu.h main.c

該命令用於列出menu.h和main.c中包含"hello"字元串且後面帶有"world"字元串的所有行,hello和world中間可以有任意多個字元。註意正則表達式的"-i"選項使得grep忽略大小寫,所以還能匹配"Hello, world!"。

下麵是一些使用grep時常見的問題和答案。

  1. 如何列出匹配的文件名?

    grep -l 'main' *.c

    將列出當前目錄下所有以".c"結尾且文件中包含'main'字元串的文件名。

  2. 如何遞歸搜索目錄?

    grep -r 'hello' /home/gigi

    搜索/home/gigi目錄下所有文件,且文件中包含'hello'字元串。如果要靈活控制搜索的文件,可以結合find和xargs命令一起使用。例如下麵的例子僅搜索C源文件。

    find /home/gigi -name '*.c' -print0 | xargs -0r grep -H 'hello'

    這不同於下麵的命令:

    grep -rH 'hello' *.c

    這僅僅只是搜索當前目錄下以".c"結尾的文件。此處的"-r"選項基本上算是多餘的,除非當前目錄下有以".c"結尾的目錄,但這是很少見的情況。上面的find命令更類似於下麵的命令:

    grep -rH --include='*.c' 'hello' /home/gigi
  3. 如果pattern以短橫線"-"開頭會如何?

    grep -e '--cut here--' *

    將搜索"--cut here--"。但如果不給定"-e"選項,grep將可能把"--cut here"解析成一系列的選項。

  4. 如何搜索整個單詞,而不是單詞中的一部分?

    grep -w 'hello' *

    這將搜索當前目錄下所有文件,並找出包含"hello"整個單詞的文件,它無法匹配"Othello"。更靈活的控制可以使用"\<"和">"來匹配單詞的開始和結尾。例如:

    grep 'hello\>' *

    僅搜索"hello"結尾的單詞,因此可以匹配"Othello"。

  5. 如何輸出匹配行的上下幾行?

    grep -C 2 'hello' *

    這將輸出匹配行以及它的前後兩行。

  6. 如何強制grep即輸出匹配行又輸出文件名? 只需在文件列表中加上'/dev/null'即可。

    grep 'eli' /etc/passwd /dev/null

    將得到:

    /etc/passwd:eli:x:2098:1000:Eli Smith:/home/eli:/bin/bash

    還可以使用GNU擴展選項"-H":

    grep -H 'eli' /etc/passwd
  7. 為什麼有人在ps的後面使用奇怪的正則表達式?

    ps -ef | grep '[c]ron'

    如果pattern中不加上中括弧,將匹配包含cron字元串的進程,包括grep自身,因為grep命令的表達式中包含了cron字元串。但如果加上了中括弧,則grep命令行中包含的是"[c]ron"字元串,而grep所匹配的字元串是cron而不是[c]ron。 在輸出結果上,這其實等價於下麵這條命令:

    ps -ef | grep 'cron' | grep -v 'grep'
  8. 為什麼grep的結果中會報告"Binary file matches"?
    如果grep列出二進位文件中的所有匹配行,將很可能生成一大堆亂七八糟的無用信息,因此GNU的grep預設禁止這樣的輸出。如果想要輸出二進位內容,使用"-a"或"--binary-files=text"選項。

  9. 為什麼'grep -lv'輸出的是包含非匹配行的文件名?
    'grep -lv'列出的是包含一行或多行非匹配行的文件名。如果想要列出無匹配內容的文件名,則使用"-L"選項。 (註:例如a.txt中一部分行匹配到了,一部分行沒匹配到,而b.txt中完全沒有匹配上,則grep -lv將輸出a.txt,而不是b.txt。因此可推測"-v"選項的操作優先順序要高於"-l",即先搜索出反轉行,再輸出包含這些反轉行的文件)

  10. 使用"|"可以實現or邏輯,如何實現AND邏輯?

    grep 'paul' /etc/motd | grep 'franc,ois'

    將搜索出同時包含"paul"和"franc,ois"的所有行。

  11. 如何同時搜索文件和標準輸入?
    只需使用"-"代替標準輸入的文件名即可:

    cat /etc/passwd | grep 'alain' - /etc/motd
  12. 正則表達式中如何表達出迴文結構?(註:迴文結構表示正讀和反讀的結果是一樣的,例如12321,abcba)
    可以使用反向引用來實現。例如,一個4字元的結構使用BRE來實現:

    grep -w -e '\(.\)\(.\).\2\1' file

    它可以匹配單詞"radar"或"civic"。 Guglielmo Bondioni提出了一個正則表達式,可以搜索長達19個迴文結構的字元串,其中使用了9個子表達式和9個反向引用。因為BRE或ERE最多只支持9個反向引用。

    grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$' file
  13. 為何反向引用會失效?

    echo 'ba' | grep -E '(a)\1|b\1'

    這不會輸出任何內容,因為左邊的表達式"(a)\1"無法匹配,因為輸入數據中沒有"aa",因此右邊的"\1"無法引用任何內容,意味著將不匹配任何東西。(此例中右邊表達式僅在左邊表達式成功匹配時才能生效。)
    註:經測試,即使左邊表達式能匹配上,右邊表達式中引用左邊的分組時也無效。例如"echo 'baaca' | grep -E '(a)\1|c\1'"可以匹配大其中的"aa",但卻匹配不到"ca"。

  14. grep如何跨行匹配?
    標準的grep無法實現該功能,因為它是基於行讀取的。因此,僅僅使用字元類"[:space:]"無法如你想象中那樣匹配換行符。
    GNU的grep有一個選項"-z",它可以處理使用"\0"結尾的行。因此,可以匹配輸入數據中的換行符,但通常很可能在輸出結果時,輸出的是所有內容而不僅是被匹配的行,因此經常需要結合輸出控制選項如"-q"來使用。例如:

    printf 'foo\nbar\nabc' | grep -z 'foo[[:space:]]\+bar'
    printf 'foo\nbar\nabc' | grep -z -q 'foo[[:space:]]\+bar'

    如果這還不滿足需求,可以將輸入數據進行格式轉換然後交給grep,或者使用其他工具替代grep,如"sed"、"awk"、"perl"或其他很多工具都能跨行操作。

  15. What do 'grep', 'fgrep', and 'egrep' stand for?
    The name 'grep' comes from the way line editing was done on Unix. For example, 'ed' uses the following syntax to print a list of matching lines on the screen:

    global/regular expression/print  
    g/re/p

    'fgrep' stands for Fixed 'grep'; 'egrep' stands for Extended 'grep'.

5 Known Bugs(已知的一些bug)


當"{n,m}"指定的重覆次數很多時,將導致grep消耗大量記憶體。此外,越模糊的正則表達式消耗的時間和空間越多,也會讓grep消耗大量記憶體。 反向引用的功能非常慢,因此可能會消耗大量時間。 (註:遞歸搜索時,也會消耗巨量的記憶體,很容易提示記憶體溢出錯誤而提前退出。)

 

回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7462706.html

註:若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支持才能激發作者更大的寫作熱情,非常感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為這兩天業務需求不是很多,昨天抽空研究了下MySQL的主從同步。 期間也遇到了許多問題,怕之後會忘記,也順便記錄下自己的成長經歷。所以寫這篇博文。 因為我是在VM虛擬機上進行的測試。 所以首先要把虛擬機的鏈接模式改為橋接模式。 在設置->硬體->網路適配器->網路連接里更改為橋接模式。 如果不是使 ...
  • 一、表與庫的概念 資料庫管理數據,它是以什麼樣的形式組成的? 生活中的表 >表 table多行多列,傳統的資料庫都是這樣的;聲明瞭表頭,一個表創建好了,剩下的就是往表中添加數據 多張表放在檔案中 >庫 database學生信息表,成績表,記過表 -> 都是這個班級的信息,將這幾張表放在一個文件夾中 ...
  • 書內容的思維導圖與讀後感 圖片顯示的大小有限制,可以右擊 在新標簽頁中打開圖片,或者, "點擊下載源文檔" : 思維 : 從《浪潮之巔》里描述的企業變遷,感受思維可以決定一個企業的方向,如果方向與新時代不符,很難改變走向頹廢或消失的結果,因為企業的基因問題,就是思維難以改變; 再到《智能時代》從第一 ...
  • 本文主要講述了PG的幾個主要進程,以及PG的核心架構。進程和體繫結構詳見下圖: 從上面的體繫結構圖可以看出來,PG使用經典的C/S架構,進程架構。在伺服器端有主進程、服務進程、子進程、共用記憶體以及文件存儲幾大部分,下麵著重講述伺服器端的進程部分: 1. Postmaster主進程和服務進程 當PG數 ...
  • 目前統計異常:ORA-00000、ORA-00001、ORA-00017、ORA-00018、ORA-00019、ORA-00020、ORA-01722、ORA-01747 文檔通過翻譯文檔、搜索資料及測試實踐對Oralce的異常做彙總、分析導致異常的各類原因及對應的解決方法,並備註一些知識點以助學... ...
  • 1. 原來的yum源做備份 2. 下載新的yum源 我用的vagrant centos 6.5 的box,預設沒有裝wget命令,yum源里也沒有wget包,下載下來替換 "阿裡yum源" "網易yum源" tips : 具體的linux版本及系統版本請自行選擇,當然,還有其他的源,選擇你自己喜歡的 ...
  • Linux PC應用程式gdb調試: 1、查看core文件參數 yinkui@yinkui-desktop:~/File_unzip/cp_module$ ulimit -a core file size (blocks, -c) 0 //產生core文件數目,不會產生core文件 data seg ...
  • JDK 下載好後使用 rpm -ivh jdk-7u25-linux-x64.rpm 進行安裝。 安裝好後編輯 /etc/profile 文件,在末尾加上: 1 2 3 export JAVA_HOME="/usr/java/jdk1.7.0_25" export CLASSPATH=.:$JAVA ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...