您好,登錄后才能下訂單哦!
grep 命令
NAME
?????? 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 次。
?????? 兩個正則表達式可以連接到一起;得出的正則表達式可以匹配任何由兩個分別匹配連接前的子表達式的子字符串連接而成的字符串。
?????? 兩個正則表達式可以用中綴操作符??????????????????????????????????????????????????????????????? |
?????? 聯合到一起,得出的正則表達式可以匹配任何匹配聯合前的任何一個子表達式的字符串。
?????? 重復操作符的優先級比連接高,接下來又比選擇的優先級高。一個完整的子表達式可以用圓括號 (parenthe‐
?????? ses) 括住來超越這些優先級規則。(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?? 和??? --directo‐
????????????? ries=skip??? 選項那樣來運作。選項以空白??? (whitespace)?? 分隔。一個反斜杠?? (backslash)
????????????? 使得下一個字符轉義 (escape),因此可以用來指定一個含有空白或者反斜杠的選項。
?????? GREP_COLOR
????????????? 指定用來高亮顯示的標記。
?????? LC_ALL, LC_COLLATE, LANG
????????????? 這些變量指定了 locale LC_COLLATE ,決定了解釋類似 [a-z]? 的范圍表達式時的序列順序? (col‐
????????????? lating 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??????????????????? 要求不可識別的選項在診斷消息中表示為?????????????????? “ille‐
????????????? gal”,但是既然它們沒有真正觸犯法律,因此默認情況下它們在診斷?? (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 選項,并且找到了選擇的行。
BUGS
?????? bug 報告的電子郵件地址是 bug-gnu-utils@gnu.org。 一定要在“Subject:”中帶有 “grep” 這個詞。
?????? 在??????????????????? {n,m}??????????????????? 結構中重復次數過多會導致??????????????????? grep
?????? 使用大量內存。另外,一些過分晦澀的正則表達式需要指數級的時間和空間,可能會導致???????????? grep
?????? 耗盡所有內存。
?????? 向后引用 (backreferences) 非常慢,可能需要指數級的時間。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。