############grep命令############
這個命令屬於文本處理三大命令之一,強大的文本搜索工具(貪婪模式)
全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
用於過濾/搜索的特定字符。可使用正則表達式能多種命令配合使用,使用上十分靈活
語法:
grep [options] PATTERN [FILE...]
選項:
-a --text # 不要忽略二進制數據。
-A <顯示行數> --after-context=<顯示行數> # 除了顯示符合范本樣式的那一行之外,並顯示該行之后的內容。
-b --byte-offset # 在顯示符合范本樣式的那一行之外,並顯示該行之前的內容。
-B<顯示行數> --before-context=<顯示行數> # 除了顯示符合樣式的那一行之外,並顯示該行之前的內容。
-c --count # 計算符合范本樣式的列數。
-C<顯示行數> --context=<顯示行數>或-<顯示行數> # 除了顯示符合范本樣式的那一列之外,並顯示該列之前后的內容。
-d<進行動作> --directories=<動作> # 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將回報信息並停止動作。
-e<范本樣式> --regexp=<范本樣式> # 指定字符串作為查找文件內容的范本樣式。
-E --extended-regexp # 將范本樣式為延伸的普通表示法來使用,意味着使用能使用擴展正則表達式。
-f<范本文件> --file=<規則文件> # 指定范本文件,其內容有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每一列的范本樣式。
-F --fixed-regexp # 將范本樣式視為固定字符串的列表。
-G --basic-regexp # 將范本樣式視為普通的表示法來使用。
-h --no-filename # 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。
-H --with-filename # 在顯示符合范本樣式的那一列之前,標示該列的文件名稱。
-i --ignore-case # 忽略字符大小寫的差別。
-l --file-with-matches # 列出文件內容符合指定的范本樣式的文件名稱。
-L --files-without-match # 列出文件內容不符合指定的范本樣式的文件名稱。
-n --line-number # 在顯示符合范本樣式的那一列之前,標示出該列的編號。
-q --quiet或--silent # 不顯示任何信息。
-R/-r --recursive # 此參數的效果和指定“-d recurse”參數相同。
-s --no-messages # 不顯示錯誤信息。
-v --revert-match # 反轉查找。
-V --version # 顯示版本信息。
-w --word-regexp # 只顯示全字符合的列。
-x --line-regexp # 只顯示全列符合的列。
-y # 此參數效果跟“-i”相同。
-o # 只輸出文件中匹配到的部分。
-m <num> --max-count=<num> # 找到num行結果后停止查找,用來限制匹配行數
規則表達式
^ # 錨定行的開始 如:'^grep'匹配所有以grep開頭的行。
$ # 錨定行的結束 如:'grep$' 匹配所有以grep結尾的行。
. # 匹配一個非換行符的字符 如:'gr.p'匹配gr后接一個任意字符,然后是p。
* # 匹配零個或多個先前字符 如:'*grep'匹配所有一個或多個空格后緊跟grep的行。
.* # 一起用代表任意字符。
[] # 匹配一個指定范圍內的字符,如'[Gg]rep'匹配Grep和grep。
[^] # 匹配一個不在指定范圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。
\(..\) # 標記匹配字符,如'\(love\)',love被標記為1。
\< # 錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。
\> # 錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。
x\{m\} # 重復字符x,m次,如:'0\{5\}'匹配包含5個o的行。
x\{m,\} # 重復字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。
x\{m,n\} # 重復字符x,至少m次,不多於n次,如:'o\{5,10\}'匹配5--10個o的行。
\w # 匹配文字和數字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零個或多個文字或數字字符,然后是p。
\W # \w的反置形式,匹配一個或多個非單詞字符,如點號句號等。
\b # 單詞鎖定符,如: '\bgrep\b'只匹配grep。
字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]
grep常用組合:
##查看配置文件,去掉注釋行和空行
cat file | grep -v ^# | grep -v '^$'
##查看匹配到的前后行
grep 'search_string' -A 1 file #表示從file文件中搜索search_string關鍵字,並顯示當前行和后面一行
grep 'search_string' -B 1 file #表示從file文件中搜索search_string關鍵字,並顯示當前行和前面一行
grep 'search_string' -C 1 file #表示從file文件中搜索search_string關鍵字,並顯示當前行和前后各一行
##精確搜索
grep -w good file #表示從file中搜索good關鍵字,且good是獨立的,比如goods就不能匹配
grep '\<good\>' file #同上
grep '\<good' file #表示從file中搜索good開頭的字符串,good,goods都可以匹配,agood就不行
grep 'good\>' file #與上相反
##從多個文件中搜索是否有匹配的關鍵字
grep "match_pattern" file_1 file_2 file_3 ...
##找出符合匹配模式的文件
grep -l "match_pattern" file_1 file_2 file_3 ... #從列出文件中搜索
grep -l "match_pattern" -r directory #表示從文件夾下的所有文件搜索
弄個有意思的
假如文本file中的內容如下:
He love his lover.
She like her liker.
He like his lover.
怎么匹配出第一行和第二行呢?特點:.*love.*love .*like.*like.* ,就像需求是要求每一行有相同的字符串
[hive@mcpl046 lgh]$ grep '.*\([a-z]\{4\}\).*\1.*' file
He love his lover.
She like her liker.
##輸出行號和偏移量(從第一個字符開始)
echo -e "b\ngun is not unix" | grep -n -b -o "not"
[hive@mcpl046 lgh]$ echo -e "b\ngun is not unix" | grep -n -b -o "not"
2:9:not
##忽略大小寫和設置顏色
grep -i "search_string" --color file
##計數
grep -c -w "search_string" file #統計file中有多少個"search_string"
##匹配多個模式
grep -e "a" -e "b" file #從file中匹配所有包含a或者b的行
##設置匹配次數
grep -m 2 "good" file #表示匹配good兩次之后就不在繼續匹配了