《LINUX入門:grep命令中文手冊(cè)(info grep翻譯)》要點(diǎn):
本文介紹了LINUX入門:grep命令中文手冊(cè)(info grep翻譯),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
1.本文為info man的譯文,基本依照原文翻譯,有幾個(gè)用不上的選項(xiàng)沒有翻譯,但為了文章的完整性,給出了原文.
2.譯文中有些"(注:)",為本人自行加入,幫助理解和說明,非原文內(nèi)容!
本文目次:
1 簡介
2 調(diào)用grep法式
2.1 敕令行選項(xiàng)
2.1.1 一般選項(xiàng)
2.1.2 節(jié)制匹配模式
2.1.3 節(jié)制輸出內(nèi)容
2.1.4 節(jié)制輸出行的前綴
2.1.5 節(jié)制輸出行的上下文
2.1.6 篩選文件和目錄
2.1.7 其他選項(xiàng)
2.2 退出狀態(tài)碼
2.3 各種grep法式
3 正則表達(dá)式
3.1 基本結(jié)構(gòu)
3.2 字符類和中括號(hào)表達(dá)式
3.3 反斜線字符和特殊的表達(dá)式
3.4 錨定
3.5 后向引用和子表達(dá)式
3.6 基礎(chǔ)正則和擴(kuò)展正則的比擬
4 使用示例
5 已知的一些Bug
?
'grep'
用于搜索給定文件中能匹配給定pattern列表的行.當(dāng)某行能匹配上,(默認(rèn))將拷貝該行到尺度輸出,或者根據(jù)你所指定的選項(xiàng)生成其它序列的輸出.
盡管'grep'所期望的是在文本行中做匹配,但即使某輸入行的大小長度超出了可用內(nèi)存空間也不會(huì)受到限制,它仍可以匹配一行中任意字符串.如果輸入文件的最后一個(gè)字節(jié)不是換行符,'grep'會(huì)自動(dòng)補(bǔ)上一個(gè).由于換行符也是pattern列表的分隔符,因此沒有任何方法匹配文本中的換行符.
?
'grep'
命令行的一般語法格局為:
grep OPTIONS PATTERN INPUT_FILE_NAMES
OPTIONS部門可以指定0或多個(gè).只有當(dāng)沒有使用"-e PATTERN"或"-f FILE"時(shí),指定的PATTERN才被grep可視.可以指定0或多個(gè)INPUT_FILE_NAMES.
?
'grep'
有年夜量選項(xiàng)可用:一些是POSIX.2中的,一些是GNU擴(kuò)展的.長選項(xiàng)都是GNU擴(kuò)展選項(xiàng),即使它們來自于POSIX.由POSIX指定的短選項(xiàng),被明確標(biāo)注為便于POSIX可移植性編程.有少數(shù)幾個(gè)選項(xiàng)是為了兼容古老版本的grep. 有幾個(gè)額外的選項(xiàng)用于控制使用哪種變體'grep'匹配引擎(注:fgrep/grep/egrep).
?
'--help'
輸出簡短的grep命令行使用贊助并退出.
'-V'
'--version'
輸出'grep'的版本號(hào).
?
'-e PATTERN'
'--regexp=PATTERN'
明確指定使用此處的PATTERN作為待匹配的pattern.該選項(xiàng)可以指定多次,它可以掩護(hù)以"-"開頭的pattern.('-e'是POSIX指定的選項(xiàng).)
'-f FILE'
'--file=FILE'
從FILE中獲取pattern列表,每行一個(gè)pattern.空的FILE表現(xiàn)不給定任何pattern,所以不會(huì)匹配到任何內(nèi)容.('-f'是POSIX指定的選項(xiàng).)
'-i'
'-y'
'--ignore-case'
忽略PATTERN中的大小寫,也忽略輸入文件中的大小寫區(qū)別.'-y'是廢棄的用于和老版本堅(jiān)持兼容性的選項(xiàng).('-i'是POSIX指定的選項(xiàng).)
'-v'
'--invert-match'
反轉(zhuǎn)匹配的成果,即選擇那些未匹配到的行.('-v'是POSIX指定的選項(xiàng).)
'-w'
'--word-regexp'
僅選擇能精確匹配整個(gè)單詞的行.單詞的組成字符包含:字母、數(shù)字和下劃線.除了這些字符,其余都是該選項(xiàng)篩選單詞時(shí)的單詞邊界分隔符. (注:例如字符串"fstab fstab(5)",grep -w 'fstab'或grep -w 'fsta.'能匹配這兩個(gè)單詞,但grep -w 'fsta'無法匹配任意一個(gè))
'-x'
'--line-regexp'
僅選擇能準(zhǔn)確匹配整行內(nèi)容的行.('-x'是POSIX指定的選項(xiàng).)
(注:例如某行"abcde",grep -x 'abc'將無法匹配該行,而grep -x 'abcd.'能匹配該行)
?
'-c'
'--count'
不再輸出匹配的內(nèi)容,而是輸出匹配到的行數(shù)量.如果給定了"-v"選項(xiàng),則輸出未匹配到的行數(shù)量.('-c'是POSIX指定的選項(xiàng).)
'--color[=WHEN]'
'--colour[=WHEN]'
對(duì)匹配到的內(nèi)容賦予顏色并輸出.WHEN的有效值包含:'never'、'always'或'auto'.
'-L'
'--files-without-match'
不再輸出匹配的內(nèi)容,而是輸出未能被匹配到的文件名,當(dāng)某文件中的某行被匹配到,將不再繼續(xù)向下搜刮該文件.
(注:和"-l"輸出的文件名相反)
'-l'
'--files-with-matches'
不再輸出匹配的內(nèi)容,而是輸出能被匹配到的文件名,當(dāng)某文件中的某行被匹配到,將不再繼續(xù)向下搜刮該文件.('-l'是POSIX指定的選項(xiàng).)
'-m NUM'
'--max-count=NUM'
當(dāng)匹配成功的行有NUM行時(shí),停止讀取文件.如果是普通文件作為標(biāo)準(zhǔn)輸入,則輸出這匹配到的NUM行.grep會(huì)在最后一次匹配行后做位置標(biāo)志,使得調(diào)用的另一個(gè)進(jìn)程可以從此處恢復(fù)并繼續(xù)向下搜索.例如,下面的shell腳本:
while grep -m 1 PATTERN
do
echo xxxx
done < FILE
而下面的shell腳本則以分歧于上面腳本方式運(yùn)行,因?yàn)榇颂幨褂玫氖枪艿?這不是一個(gè)實(shí)體文件:
cat FILE |
while grep -m 1 PATTERN
do
echo xxxx
done
(注:如果對(duì)這兩個(gè)劇本有疑問,可參考while循環(huán)中的陷阱,該文章中解釋了管道和文件直接重定向時(shí)的區(qū)別)
'-o'
'--only-matching'
輸出被匹配到的字符串,而不是輸出整行.每個(gè)被匹配到的字符串都使用零丁的行輸出.
'-q'
'--quiet'
'--silent'
靜默模式,立即退出,即使遇到了錯(cuò)誤.不寫任何內(nèi)容到尺度輸出.如果匹配到了內(nèi)容則退出狀態(tài)碼為0.('-q'是POSIX指定的選項(xiàng).)
'-s'
'--no-messages'
禁止輸出因文件不存在或文件沒有讀權(quán)限而產(chǎn)生的差錯(cuò)信息.('-s'是POSIX指定的選項(xiàng).)
(注:由于POSIX和GNU grep的差別性,在可移植性的腳本中,應(yīng)盡量避免使用"-q"和"-s",而是使用重定向的方式重定向到/dev/null)
?
當(dāng)輸出行有前綴要輸出時(shí),它們的次序總是:文件名、行號(hào)、字節(jié)的偏移量,這個(gè)次序不會(huì)因?yàn)榍熬Y控制選項(xiàng)的次序而改變.
'-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'
輸出匹配到內(nèi)容地點(diǎn)文件的文件名.當(dāng)指定了多個(gè)輸入文件時(shí),這是默認(rèn)的.
'-h'
'--no-filename'
制止輸出文件名.當(dāng)只有一個(gè)輸入文件時(shí),這是默認(rèn)的.
'--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'
輸出匹配內(nèi)容在文件中的行號(hào),每個(gè)文件都零丁從1開始計(jì)數(shù).('-n'是POSIX指定的選項(xiàng).)
'-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'
在輸出文件名時(shí),使用"\0"放在文件名后,這會(huì)替換底本使用的字符,如換行符或冒號(hào).例如"grep -lZ"輸出的每個(gè)文件都在同一行而不是分行,"grep -HZ"使得文件名后沒有冒號(hào).
?
無論下面的選項(xiàng)如何設(shè)置,grep都不會(huì)多次輸出同一行.如果指定了"-o"選項(xiàng),這些???項(xiàng)將失效,并給出一個(gè)警告.
'-A NUM'
'--after-context=NUM'
除了輸出匹配到的行,還輸出匹配到內(nèi)容的后NUM行.
'-B NUM'
'--before-context=NUM'
除了輸出匹配到的行,還輸出匹配到內(nèi)容的前NUM行.
'-C NUM'
'-NUM'
'--context=NUM'
除了輸出匹配到的行,還輸出匹配到內(nèi)容的前NUM行和后NUM行.
'--group-separator=STRING'
當(dāng)使用'-A', '-B' or '-C'時(shí),使用STRING替代默認(rèn)的組分隔符.
(注:組分隔符表現(xiàn)匹配到的內(nèi)容的上下文.例如"-A 2",在某行匹配到時(shí),還將輸出后兩行,這是一個(gè)組.下一次匹配成功時(shí),如果是在該組之后行匹配上的,則這兩組中間默認(rèn)使用"--"分隔)
'--no-group-separator'
當(dāng)使用'-A', '-B' or '-C'時(shí),不輸出任何組分隔符,而是將分歧組相鄰輸出.
?
'-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的排除規(guī)矩.
'--exclude-dir=DIR'
篩選出不進(jìn)行遞歸搜索的目次,使用DIR進(jìn)行匹配.
'-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'
從命令行中給定的目錄中遞歸進(jìn)去,搜索此中的每個(gè)文件和目錄.
?
'--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.)
?
通常情況下,如果能匹配到內(nèi)容,則退出狀態(tài)碼為0,不然為1.但是如果發(fā)生了錯(cuò)誤,則退出狀態(tài)碼為2,除非使用了"-s"或"-q"選項(xiàng).
?
有4種grep程序分別支持分歧的搜索引擎,使用下面4個(gè)選項(xiàng)可以選擇使用哪種grep程序.
'-G'
'--basic-regexp'
使用基礎(chǔ)正則表達(dá)式引擎解析PATTERN,因此只支持基礎(chǔ)正則表達(dá)式(BRE).這是默認(rèn)grep法式.
'-E'
'--extended-regexp'
使用擴(kuò)大正則表達(dá)式引擎解析PATTERN,因此支持?jǐn)U大正則表達(dá)式(ERE).('-E'是POSIX指定的選項(xiàng).)
'-F'
'--fixed-strings'
不辨認(rèn)正則表達(dá)式,而是使用字符的字面意義解析PATTERN,因此只支持固定字符串的精確匹配.('-F'是POSIX指定的選項(xiàng).)
'-P'
'--perl-regexp'
使用perl正則表達(dá)式引擎解析PATTERN,因此支持Perl正則表達(dá)式.但該法式正處于研究測(cè)試階段,因此會(huì)給出一個(gè)警告.
此外,"grep -E"和"grep -F"可分別簡寫為egrep和fgrep.但這兩個(gè)簡寫法式是傳統(tǒng)寫法,已被廢棄,雖仍支持,但只是為了兼容老版本法式.
(注:還有zgrep和pgrep,但它們不是grep家族的法式,zgrep是gzip提供,pgrep用于查看進(jìn)程名和pid的映射關(guān)系)
?
正則表達(dá)式是一種用于描述字符串集合的表達(dá)式.正則表達(dá)式類似于算術(shù)表達(dá)式,也使用各種操作符組合各短小表達(dá)式.grep可以理解三種不同版本的正則表達(dá)式:基礎(chǔ)正則表達(dá)式BRE、擴(kuò)展正則表達(dá)式ERE和Perl正則表達(dá)式.下面所描述的是擴(kuò)展正則表達(dá)式的內(nèi)容,在后文會(huì)比擬BRE和ERE的不同之處.而Perl正則功能更完整、性能更好,可以從pcresyntax(3)和pcrepattern(3)中獲取詳細(xì)信息,但有些操作系統(tǒng)中可能無法獲取.
?
基本結(jié)構(gòu)塊是匹配單個(gè)字符的正則表達(dá)式.大多數(shù)字符,包含字母和數(shù)字,都能自己匹配自己,例如給定正則表達(dá)式"a",它能匹配字母a.所有的元字符都具有特殊意義,需要使用反斜線進(jìn)行轉(zhuǎn)義.
正則表達(dá)式可以使用下面幾種方式來表現(xiàn)重復(fù)次數(shù).
'.'
點(diǎn)"."可以匹配隨意率性單個(gè)字符.
'?'
可以匹配前一個(gè)條目0或一次.例如,"ca?b"可以匹配"cb"也可以匹配到"cab",但不克不及匹配到"caab".如果使用了分組,如"c(ca)?b"能匹配"cb"或"ccab".
'*'
匹配前一個(gè)條目0或隨意率性多次.
'+'
匹配前面的條款一次或多次.
'{N}'
匹配前面的條目恰好N次.
'{N,}'
匹配前面的條款N次或更多次.即至少匹配N次.
'{,M}'
匹配前面的條款最多M次.即匹配0到M次.
'{N,M}'
匹配前面的條款N到M次.
兩個(gè)正則表達(dá)式可以進(jìn)行串聯(lián),串聯(lián)后的匹配結(jié)果是這兩個(gè)正則表達(dá)式的匹配結(jié)果進(jìn)行的串聯(lián).例如正則表達(dá)式"ab"便是"a"和"b"串聯(lián)后的正則.
兩個(gè)正則表達(dá)式還可以使用豎線符號(hào)"|"進(jìn)行連接,這表現(xiàn)二者選一,只要能匹配豎線兩邊任意一個(gè)正在表達(dá)式均可,若能同時(shí)匹配上也可.例如字符串"acx"、"bx"、"accb"均能被正則表達(dá)式"ac|b"匹配上,其中"accb"被同時(shí)匹配上.
反復(fù)次數(shù)的符號(hào)優(yōu)先級(jí)高于串聯(lián)高于二者選一符號(hào)"|",使用括號(hào)可以改變優(yōu)先級(jí)規(guī)則.
?
中括號(hào)正則表達(dá)式是使用"["和"]"包抄的字符列表.它能匹配該列表中的任意單個(gè)字符.如果列表中的第一個(gè)字符是"^",則表示不匹配該列表中的任意單個(gè)字符.例如,'[0123456789]'能匹配任意數(shù)字.
中括號(hào)中可以使用連字符"-"連接兩個(gè)字符表現(xiàn)"范圍".例如,C字符集下的"[a-d]"等價(jià)于"[abcd]".大多數(shù)字符集規(guī)則和字典排序規(guī)則一樣,這意味著"[a-d]"不等價(jià)于"[abcd]",而是等價(jià)于"[aBbCcDd]".可以設(shè)置環(huán)境變量"LC_ALL"的值為C使得采取C字符集的排序規(guī)則.
最后,預(yù)定義了幾個(gè)特定名稱的字符類,它們都使用中括號(hào)包抄.如下:
'[:alnum:]'
匹配年夜小寫字母和數(shù)字.等價(jià)于字符類'[:alpha:]'與字符類'[:digit:]'的和.
'[:alpha:]'
字母字符類.匹配年夜小寫字母.等價(jià)于字符類'[:lower:]'和字符類'[:upper:]'的和.
'[:blank:]'
空白字符類.包含:空格和制表符.
'[:cntrl:]'
控制字符類.在ASCII中,這些字符的八進(jìn)制代碼從000到037,還包含177(DEL).
'[:digit:]'
數(shù)字字符類.包含:'0 1 2 3 4 5 6 7 8 9'.
'[:graph:]'
繪圖類.包含:大小寫字母、數(shù)字和標(biāo)點(diǎn)符號(hào).等價(jià)于
'[: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:]'
打印字符類.包含:大小寫字母、數(shù)字、標(biāo)點(diǎn)符號(hào)和空格.等價(jià)于字符類'[:alnum:]'與字符類'[:punct:]'和空格的和.
'[:punct:]'
標(biāo)點(diǎn)符號(hào)類.包含:'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'.
'[: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:]'
十六進(jìn)制類.包含:'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]".注意,字符類必須包括在額外的中括號(hào)內(nèi).
中括號(hào)中的年夜多數(shù)元字符都丟失了它們特殊意義,而成為普通的字面符號(hào).
']'
該符號(hào)表示中括號(hào)的結(jié)束.如果要匹配該字面字符,則必需將其放在字符列表的最前面.即"[]...]".
'[.'
該符號(hào)表示排序符號(hào)的開始.
(注:排序類必要在字符集中預(yù)先定義好才能使用.例如[.ab.]表示將“ab”作為整體匹配,不匹配a或b.但默認(rèn)情況下,字符集里肯定是沒有定義好"ab"這個(gè)排序整體的,所以無法使用)
'.]'
表現(xiàn)排序符號(hào)的結(jié)束.
'[='
表現(xiàn)等價(jià)類的開始.
(注:例如,[=e=]表現(xiàn)將字母e的第一聲和第三聲等不同音節(jié)的同字母看成相同字符.)
'=]'
表現(xiàn)等價(jià)類的結(jié)束.
'[:'
表現(xiàn)字符類的開始.
':]'
表現(xiàn)字符類的結(jié)束.
'-'
該字符是范圍連接符,因此要匹配該符號(hào)的字面意義,必要將其放在列表的最前面或最后面或作為范圍的結(jié)束字符.
'^'
該字符表示不在列表中的字符.如果想匹配該字符的字面意義,則必需不能放在列表的第一個(gè)字符.
?
反斜線"\"后使用特定的字符表現(xiàn)特殊意義,如下:
'\b'
匹配單詞界限處的空字符. (注:grep中的單詞有數(shù)字、字母和下劃線組成,其他所有字符都是單詞的分隔符.)
'\B'
和"\b"相反,表示匹配非單詞界限的空字符.
'\<'
匹配單詞起始地位處的空字符.
'\>'
匹配單詞結(jié)束地位處的空字符.
(注:所以\bWORD\b等價(jià)于\<word\>.另外,grep選項(xiàng)"-w"也表示匹配單詞界限)
'\w'
匹配單詞身分的字符.是[_[:alnum:]]的同義詞.
'\W'
匹配非單詞身分的字符,是[^_[:alnum:]]的同義詞.
'\s'
匹配空缺字符,是[[:space:]]的同義詞.
'\S'
匹配非空缺字符,是[^[:space:]]的同義詞.
例如,"\brat\b"匹配被朋分后的"rat","\Brat\B"匹配"crate"但不匹配"furry rat".
?
脫字符"^"以及美元符"$"是錨定元字符,分離匹配行首和行尾的空字符.
?
反向引用"\N"表現(xiàn)匹配前面第N個(gè)括號(hào)中的正則子表達(dá)式,其中N是單個(gè)數(shù)字.例如"(a)\1"表現(xiàn)"aa".當(dāng)使用二選一的操作符"|"時(shí),如果分組不參與匹配過程,則后向引用將失敗.例如"a(.)|b\1"將無法匹配"ba". 如果使用"-e"或"-f FILE"指定了多個(gè)PATTERN,則每個(gè)pattern的后向序列值都相互獨(dú)立.
(注:例如:'([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,因?yàn)榈谝粋€(gè)括號(hào)在左邊,無法參與右邊的正則搜索.
(注:反向引用也稱為后向引用或回溯引用)
?
在基礎(chǔ)正則表達(dá)式中,元字符'?'、'+'、'{'、'|'、'(',和')'都表現(xiàn)字面意思,取而代之的是加上反斜線的版本:'\?'、'+'、'{'、'\|'、'('和')'.
?
以下是一些GNU grep的使用示例:
grep -i 'hello.*world' menu.h main.c
該命令用于列出menu.h和main.c中包括"hello"字符串且后面帶有"world"字符串的所有行,hello和world中間可以有任意多個(gè)字符.注意正則表達(dá)式的"-i"選項(xiàng)使得grep忽略大小寫,所以還能匹配"Hello, world!".
下面是一些使用grep時(shí)常見的問題和謎底.
若何列出匹配的文件名?
grep -l 'main' *.c
將列出當(dāng)前目錄下所有以".c"結(jié)尾且文件中包括'main'字符串的文件名.
如何遞歸搜索目次?
grep -r 'hello' /home/gigi
搜索/home/gigi目錄下所有文件,且文件中包括'hello'字符串.如果要靈活控制搜索的文件,可以結(jié)合find和xargs命令一起使???.例如下面的例子僅搜索C源文件.
find /home/gigi -name '*.c' -print0 | xargs -0r grep -H 'hello'
這分歧于下面的命令:
grep -rH 'hello' *.c
這僅僅只是搜索當(dāng)前目錄下以".c"結(jié)尾的文件.此處的"-r"選項(xiàng)基本上算是過剩的,除非當(dāng)前目錄下有以".c"結(jié)尾的目錄,但這是很少見的情況.上面的find命令更類似于下面的命令:
grep -rH --include='*.c' 'hello' /home/gigi
如果pattern以短橫線"-"開首會(huì)如何?
grep -e '--cut here--' *
將搜索"--cut here--".但假如不給定"-e"選項(xiàng),grep將可能把"--cut here"解析成一系列的選項(xiàng).
如何搜索整個(gè)單詞,而不是單詞中的一部門?
grep -w 'hello' *
這將搜索當(dāng)前目錄下所有文件,并找出包括"hello"整個(gè)單詞的文件,它無法匹配"Othello".更靈活的控制可以使用"\<"和">"來匹配單詞的開始和結(jié)尾.例如:
grep 'hello\>' *
僅搜刮"hello"結(jié)尾的單詞,因此可以匹配"Othello".
若何輸出匹配行的上下幾行?
grep -C 2 'hello' *
這將輸出匹配行以及它的前后兩行.
若何強(qiáng)制grep即輸出匹配行又輸出文件名? 只需在文件列表中加上'/dev/null'即可.
grep 'eli' /etc/passwd /dev/null
將獲得:
/etc/passwd:eli:x:2098:1000:Eli Smith:/home/eli:/bin/bash
還可以使用GNU擴(kuò)大選項(xiàng)"-H":
grep -H 'eli' /etc/passwd
為什么有人在ps的后面使用奇異的正則表達(dá)式?
ps -ef | grep '[c]ron'
如果pattern中不加上中括號(hào),將匹配包括cron字符串的進(jìn)程,包括grep自身,因?yàn)間rep命令的表達(dá)式中包括了cron字符串.但如果加上了中括號(hào),則grep命令行中包括的是"[c]ron"字符串,而grep所匹配的字符串是cron而不是[c]ron. 在輸出結(jié)果上,這其實(shí)等價(jià)于下面這條命令:
ps -ef | grep 'cron' | grep -v 'grep'
為什么grep的結(jié)果中會(huì)申報(bào)"Binary file matches"?
如果grep列出二進(jìn)制文件中的所有匹配行,將很可能生成一大堆亂七八糟的無用信息,因此GNU的grep默認(rèn)禁止這樣的輸出.如果想要輸出二進(jìn)制內(nèi)容,使用"-a"或"--binary-files=text"選項(xiàng).
為什么'grep -lv'輸出的是包括非匹配行的文件名?
'grep -lv'列出的是包括一行或多行非匹配行的文件名.如果想要列出無匹配內(nèi)容的文件名,則使用"-L"選項(xiàng). (注:例如a.txt中一部分行匹配到了,一部分行沒匹配到,而b.txt中完全沒有匹配上,則grep -lv將輸出a.txt,而不是b.txt.因此可推測(cè)"-v"選項(xiàng)的操作優(yōu)先級(jí)要高于"-l",即先搜索出反轉(zhuǎn)行,再輸出包括這些反轉(zhuǎn)行的文件)
使用"|"可以實(shí)現(xiàn)or邏輯,若何實(shí)現(xiàn)AND邏輯?
grep 'paul' /etc/motd | grep 'franc,ois'
將搜索出同時(shí)包括"paul"和"franc,ois"的所有行.
如何同時(shí)搜索文件和尺度輸入?
只需使用"-"代替尺度輸入的文件名即可:
cat /etc/passwd | grep 'alain' - /etc/motd
正則表達(dá)式中如何表達(dá)出回文結(jié)構(gòu)?(注:回文結(jié)構(gòu)表現(xiàn)正讀和反讀的結(jié)果是一樣的,例如12321,abcba)
可以使用反向引用來實(shí)現(xiàn).例如,一個(gè)4字符的結(jié)構(gòu)使用BRE來實(shí)現(xiàn):
grep -w -e '\(.\)\(.\).\2\1' file
它可以匹配單詞"radar"或"civic". Guglielmo Bondioni提出了一個(gè)正則表達(dá)式,可以搜索長達(dá)19個(gè)回文布局的字符串,其中使用了9個(gè)子表達(dá)式和9個(gè)反向引用.因?yàn)锽RE或ERE最多只支持9個(gè)反向引用.
grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$' file
為何反向引用會(huì)失效?
echo 'ba' | grep -E '(a)\1|b\1'
這不會(huì)輸出任何內(nèi)容,因?yàn)樽筮叺谋磉_(dá)式"(a)\1"無法匹配,因?yàn)檩斎霐?shù)據(jù)中沒有"aa",因此右邊的"\1"無法引用任何內(nèi)容,意味著將不匹配任何東西.(此例中右邊表達(dá)式僅在左邊表達(dá)式成功匹配時(shí)能力生效.)
注:經(jīng)測(cè)試,即使左邊表達(dá)式能匹配上,右邊表達(dá)式中引用左邊的分組時(shí)也無效.例如"echo 'baaca' | grep -E '(a)\1|c\1'"可以匹配大其中的"aa",但卻匹配不到"ca".
grep如何跨行匹配?
標(biāo)準(zhǔn)的grep無法實(shí)現(xiàn)該功能,因?yàn)樗腔谛凶x取的.因此,僅僅使用字符類"[:space:]"無法如你想象中那樣匹配換行符.
GNU的grep有一個(gè)選項(xiàng)"-z",它可以處理使用"\0"結(jié)尾的行.因此,可以匹配輸入數(shù)據(jù)中的換行符,但通常很可能在輸出結(jié)果時(shí),輸出的是所有內(nèi)容而不僅是被匹配的行,因此經(jīng)常必要結(jié)合輸出控制選項(xiàng)如"-q"來使用.例如:
printf 'foo\nbar\nabc' | grep -z 'foo[[:space:]]\+bar'
printf 'foo\nbar\nabc' | grep -z -q 'foo[[:space:]]\+bar'
如果這還不滿足需求,可以將輸入數(shù)據(jù)進(jìn)行格局轉(zhuǎn)換然后交給grep,或者使用其他工具替代grep,如"sed"、"awk"、"perl"或其他很多工具都能跨行操作.
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'.
?
當(dāng)"{n,m}"指定的重復(fù)次數(shù)很多時(shí),將導(dǎo)致grep消耗大量內(nèi)存.此外,越模糊的正則表達(dá)式消耗的時(shí)間和空間越多,也會(huì)讓grep消耗大量內(nèi)存. 反向引用的功能非常慢,因此可能會(huì)消耗大量時(shí)間. (注:遞歸搜索時(shí),也會(huì)消耗巨量的內(nèi)存,很容易提示內(nèi)存溢出差錯(cuò)而提前退出.)
本文永遠(yuǎn)更新鏈接地址:
《LINUX入門:grep命令中文手冊(cè)(info grep翻譯)》是否對(duì)您有啟發(fā),歡迎查看更多與《LINUX入門:grep命令中文手冊(cè)(info grep翻譯)》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/8843.html