grep grep命令的功能似乎過濾制定規則的信息。 冷知識:grep的名字來源於一個sed格式:g/re/p g:所有行,re:正則規則,p:列印 用法: grep(global search regular express and print out line)列印匹配的行(內容) 類似的命令包 ...
grep
grep命令的功能似乎過濾制定規則的信息。
冷知識:grep的名字來源於一個sed格式:g/re/p g:所有行,re:正則規則,p:列印
用法:
grep(global search regular express and print out line)列印匹配的行(內容)
類似的命令包括egrep、fgrep、rgrep
grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]
grep在指定的文件中搜索包含PATTERN匹配的行。如果不指定文件或指定了“-”,則從標準輸入中進行搜
索。 預設情況下,grep列印匹配的行。
此外,grep還有很多演變命令,如egrep、fgrep和rgpre,分別對應grep -E、grep -F和grep -r。
這些變種已經棄用,但他們被提供用作向後相容。
選項
1. 匹配方式的選擇
-E, --extended-regexp
將PATTERN作為擴展的正則表達式(ERE)
-F,--fixed-strings
將PATTERN作為為固定字元串的列表,由換行符分隔,匹配其中任意一個
-G, --basic-regexp
將PATTERN作為基本正則表達式(BRE),該選項為預設設置
-P,--perl-regexp
將PATTERN作為perl相容正則表達式(PCRE)。
2. 匹配控制
-e PATTERN, --regexp=PATTERN
將PATTERN作為匹配項,如果該選項被多次使用或和-f(--file)選項一起使用,匹配所有
的匹配項。該選項可以用來保護以'-'開頭的匹配項。
-f FILE,--file=FILE
將FILE中的每行都作為匹配項,如果此選項被多次使用或與-e(--regexp)選項組合使用,搜索所有給定的匹配項。空文件包含零個匹配項,因此不匹配任何內容
-i,--ignore-case
忽略匹配項的大小寫
-v,--invert-match
反向匹配,選擇沒有匹配上的行
-w,--word-regexp
僅匹配完整單詞,匹配的子字元串必須位於行的開頭,或者前面有一個非字詞字元。類似地,它必須位於行尾或後面跟非字片語成字元(字片語成字元是字母、數字和下劃線)。
-x,--line-regexp
僅選擇與整行完全匹配的匹配項。對於正則表達式匹配項,這類似於將匹配項括起來,然後用^和$將其包圍。
-y 和-i作用相同,但已過時
3. 通用輸出控制
-c,--count
不列印匹配結果,而是列印匹配的行數
--color[=WHEN],--colour[=WHEN]
將匹配到的字元串、行、上下文行、文件名、行號、位元組偏移量和帶轉義符的分隔符(用於欄位和上下文行組)序列著色,顏色有環境變數GREP_COLORS決定,雖然GREP_COLOR已經過時,但grep依然支持該環境變數,只不過優先權比GREP_COLORS低。WHEN可以為never、always和auto。相關環境變數介紹
:略。
-L,--files-without-match
不列印正常匹配結果,而是列印沒有匹配上的文件的名稱,掃描將在第一次匹配時停止。
-l,--files-with-matches
不列印正常匹配結果,而是列印匹配上的輸入文件的名稱,掃描將在第一次匹配時停止
-m NUM --max-count=NUM
在匹配到NUM行後停止讀取文件
-o,--only-matching
僅列印匹配行中(非空的)匹配部分,每個部分在單獨的輸出行上
-q,--quiet,--silent
不向標準輸出列印任何內容,匹配到內容立刻退出,即使檢測到錯誤
-s,--no-messages
當文件不存在或文件不可讀取時,不顯示錯誤信息
4. 輸出行首碼控制
-b,--byte-offset
在每行輸出之前,列印輸入文件中基於0的位元組偏移量。如果指定了-o(--only-matching),則列印
匹配項本身的偏移量
-H,--with-filename
列印每個匹配的文件名,當匹配到多個匹配項時,該選項為預設配置
-h,--no-filename
在輸出中不顯示文件名,只匹配到單個結果時,預設不顯示文件名
--label=LABEL
將標準輸入顯示為來自文件標簽的輸入(???不理解)
-n,--line-number
顯示行號
-T,--initial-tab
使匹配結果中每行的第一個字元位於製表位上,以便製表的對齊看起來顯得正常。該選項對一些給輸出內
容加首碼的選項很有作用:-H、-n和-b
-u,--unix-byt-offsets
報告Unix樣式的位元組偏移量,此開關使grep報告位元組偏移量,就像文件是Unix樣式的文本文件一樣,即
去掉CR字元。這將產生與在Unix機器上運行grep相同的結果。除非同時使用-b選項,否則此選項無效,
它對MS-DOS和MS Windows以外的平臺沒有影響。
-Z,--null
將文件名後面的符號(冒號或回車)改為零位元組(ASCII NUL 字元),例如,grep -lZ在每個文件名
後輸出一個零位元組,而不是通常的換行。此選項使輸出明確,甚至如果文件名包含不尋常的字元,如新行。
此選項可與其他命令一起使用,如find -print0、perl-0、sort-z和xargs-0來處理任意文件名,
甚至包含換行符的文件名。
5. 上下文控制
-A NUM,--after-context=NUM
在匹配行之後列印下文的NUM行,連續的匹配組之間用分隔符“--”隔開。和-o或--only-matching選項
一起使用時,該選項沒有任何效果,並且會發出警告
-B NUM,--before-context=NUM
在匹配行的前面列印上文的NUM行,,連續的匹配組之間用分隔符“--”隔開。和-o或--only-matching
選項一起使用時,該選項沒有任何效果,並且會發出警告
-C NUM,-NUM,--context=NUM
列印匹配行的上下文各NUM行,連續的匹配組之間用分隔符“--”隔開。和-o或--only-matching選項
一起使用時,該選項沒有任何效果,並且會發出警告
6. 文件及目錄的選擇
-a,--text
像處理文本一樣處理二進位文件,相當於--binary-files=text選項
--binary-files=TYPE
如果文件的前幾個位元組指示該文件包含二進位數據,則假定文件的類型為TYEP。預設情況下,TYPE為
binary,grep通常只輸出一行表示二進位文件匹配的消息,或者因為沒有匹配結果而沒有輸出;如果
TYPE為without-match,則grep不對二進位文件進行匹配,相當於-I選項;如果TYPE為text,grep
將二進位文件當作文本文件處理,這相當於-a選項,處理二進位數據時,grep可以將非文本位元組視為行
終止符,例如,模式“.”(句點)可能不能匹配空位元組,因為空位元組可能被視為行終止符。警告:grep
--binary-files=text可能輸出二進位垃圾,如果輸出是終端且終端驅動程式將其中一些文本解釋為
命令則可能會產生嚴重的副作用。
-D ACTION,--devices=ACTION
如果輸入文件是一個設備、FIFO或則套接字,使用ACTION去處理它,ACTION預設為read,意味著該文
件將被當作普通文件進行讀取。如果ACTION為skip,設備文件被忽略。
-d ACTION,--directories=ACTION
如果輸入文件為一個目錄,使用ACTION處理它。ACTION預設為read,即將目錄作為普通文件處理。如果
ACTION為skip,跳過該目錄。如果ACTION為recurse,遞歸讀取目錄下的所有文件,並且遵循命令行
符號鏈接,相當於-r選項
--exclude=GLOB
跳過名稱與GLOB匹配的文件(使用通配符匹配),文件名glob可以使用*、?、和[…]作為通配符,並逐
字引用通配符或反斜杠字元。
--exclude-from=FILE
跳過其基名稱與從FILE讀取的任意文件名通過glob匹配的文件(使用通配符匹配,如--exclude下所述)
--exclude-dir=DIR
從遞歸搜索中排除與DIR匹配的目錄
-I
處理二進位文件,就像它不包含匹配的數據一樣,這相當於--binary-files=without-match選項。
--include=GLOB
搜索名稱與從GLOB匹配的文件(使用通配符匹配,如--exclude下所述)
-r,--recursive
遞歸讀取目錄下的所有文件,並且遵循命令行符號鏈接。如果沒有給定文件操作數,grep將搜索當前工作
目錄。該命令相當於-d recurse選項
-R,--dereference-recursive
遞歸讀取目錄下所有文件,遵循所有符號鏈接
7. 其他選項
--line-buffered
在輸出上使用行緩衝,這可能會導致性能下降
-U,--binary
將文件視為二進位文件,預設情況下,在MS-DOS和MS-Window中,grep通過讀取文件前32KB的內容決
定這個文件的類型,如果文件為文本文件,grep從原始文件中刪除CR字元(使帶有‘^'和’$'的正則表達
式能正常工作),指定-U可以讓其對文件進行逐字讀取。如果文件為文本文件,每行末尾有CR/LF,這將
造成一些正則表達式失效。該選項對MS-DOS和MS-Windows以外的平臺無影響。
-z,--null-data
將輸入視為一組行,每個行以零位元組(ASCII NUL字元)而不是換行符終止,與-Z或--null選項類似,
此選項可以與sort -z等命令一起使用,以處理任意文件名。
示例
1. 在文件中搜索字元串
grep -i 字元串 文件名
加上-n
參數可以顯示匹配出來的行號
顯示不匹配的行-v
-v
參數顯示的就是不包含字元串的所有內容
2. 使用grep過濾命令輸出
3. 使用正則
由於在grep中,基本正則表達式和擴展正則表達式在使用時的區別在於:在基本正則表達式中,元字元?、+、{、|、(、和)失去了特殊意義,需要使用反斜杠版本\?、+、{、|、(、和\)。如果不加任何匹配方式的選項,預設為-G,即基本正則表達式。
匹配某個字元在行首的情況
匹配某個字元在行尾的情況
匹配某個字元前有任意字元的情況
匹配某個字元前面是特定字元的情況
匹配某個字元前面不是特定字元的情況
4. 擴展正則
匹配 bz 或 gz 或 z 開頭,後邊跟 ip 的行,這裡用到了擴展正則中的 小括弧 和 或符號"|":
這裡就需要用到-E參數
,實質上是過濾多個參數的表達式匹配,用小括弧擴起來表示一個整體
grep -E的用法等同於egrep
列印ip信息
上述兩個命令裡面,必須要加上轉義符號才能表達符號原本的意思,
5. grep -F
grep -F PATTERN… [FILE…] 將PATTERN作為固定字元串形式的匹配項,不識別正則表達式。等同於fgrep命令
在實踐中,我有一個需求,搜索日誌關鍵字,而這一串關鍵字中包含了特殊字元,這些字元在正則式中有獨特的語法,而你又不想用複雜的正則表達式去匹配的時候。那麼grep -F 就派上了用場:
現在有這麼一堆文件,裡面包含了各式各樣的文件名,如果我們想要找文件名為‘^abc’的文件
尋找efg$的文件:
與此類推:
6. grep -e
grep -e PATTERN… [FILE…] 和grep -f FILE… [FILE…]
-e的作用和不加參數時類似,唯一區別是可以保護以‘-’開頭的匹配項
[root@honey-master data] cat test
-test
test
-f的作用是將FILE中的每行都作為匹配項,和-e一樣可以多次使用
把模板(pattern)寫在一個文件里,然後使用-f參數來讀取這些pattern,如果文件中包含0個pattern,那麼什麼都不匹配;如果有多個pattern,那麼必須一行寫一個pattern,即:列印後面文件中與前面文件中相同的行,並且,-f參數後面作為標準的文件一定不能有空格
我們可以看到使用test1文件去匹配test文件,所以輸出會有全部的test文件內容
這裡解釋了為什麼-f參數後面的文件不能有空格。
7. grep -i
忽略大小寫
[root@honey-master test] cat test
test1_ivanlee
test1_ivanlee1
tesT1_IVANlee2
8. grep -w
匹配完整的單詞,單詞前後不能有其他字母或數字,但允許單詞前面有非字詞符號(包括空格)。
9. grep -x
整行匹配
10. grep -c
列印匹配的行數
11. grep -color[=WHEN] PATTERN… [FILE…]
可以看到centos系統預設使用紅色顯示匹配項,只不過他只有三個選項,分別是never,auto,always
always和auto的區別就是,always會在任何情況下都給匹配欄位加上顏色標記,當通過管道或重定向時就會多出一些控制字元,結果會變成
export [[1;32m[[KGREP[[m[[K_OPTIONS='--color=always'
export [[1;32m[[KGREP[[m[[K_COLOR='1;32'
而auto則只在輸出到終端時才加上顏色。
如果想改變匹配顏色,可以修改./bashrc
文件
export GREP_COLOR='a;b' #預設是1;31,即高亮的紅色
來設置,其中:
a可以選擇:【0,1,4,5,7,8】
0 關閉所有屬性
1 設置高亮度
4 下劃線
5 閃爍
7 反顯
8 消隱
其他的效果太難看了~~~~
自己也可以去琢磨顏色,把b值設置為20就是綠色
12 grep -L和l
L不列印匹配的內容,列印FILE中沒有匹配上的文件(不能是文件內容了,只能是文件名)。l列印匹配成功的文件名
13. grep -m
grep -m NUM PATTERN… [FILE…] 每個文件最多匹配出NUM行,
14. grep -o
僅列印匹配的內容,而不是匹配的一整行
15. grep -q
不顯示匹配結果,匹配結束立刻退出
16. grep -s
不顯示文件不存在和讀取失敗的錯誤信息
17. grep -b
列印匹配項基於文件開頭的偏移量
18 grep -n
顯示匹配項在文件中的行號
19 grep -h
不顯示文件名,單個文件匹配時,預設不顯示文件名
20. grep -T
顯示時使用製表符
21. grep -Z
文件名後面的符號改為零位元組(ASCII NUL字元)
22. grep -A
23. grep -a PATTERN… [FILE…]
將二進位文件當做文本文件來處理。
28. grep --binary-files=TYPE PATTERN… [FILE…]
TYPE的值可以為:binary(預設)、without-match、text,binary和without-match的區別是前者使用時會提示二進位文件無法匹配,後者不會提示,–binary-files=text相當於-a選項。