第十六章 在文件中搜索文本工具:grep命令 和egrep命令
阿新 • • 發佈:2018-06-19
oot his a-z 多個 查找 sea 內容 args lar 第十六章 在文件中搜索文本工具:grep命令 和egrep命令
名詞解釋
grep(global search regular expression(RE)and print out the line,全面搜索正則表達式並把行打印出來)
grep是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
選項
- -a :不要忽略二進制數據 - -A <顯示行數>:除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容。 - -b :在顯示符合範本樣式的那一行之外,並顯示該行所有的內容。 - -B <顯示行數>:除了顯示符合範本樣式的那一行之外,並顯示該行之前的內容。 - -c ,--count : 計算符合範本樣式的行數。 - -C <顯示列數>或-<顯示列數>:除了顯示符合範本樣式的那一行之外,並顯示 該行 的前後行內容。 - -d <進行動作>:當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將匯報信息並停止動作。-d recurse 遞歸查找的意思。 - -e <範本樣式>:指定字符串作為查找文件內容的範本樣式。 - -E :將範本樣式為延伸的普通表示法來使用,意味著能使用擴展正則表達式。 - -f <範本文件>:指定範本文件,其內容有一個或多個 範本樣式,讓grep查找符合範本條件的文件內容,格式為每一行的範本樣式。 - -F :將範本樣式視為固定字符串的列表。 - -G :將範本樣式視為普通的表示法來使用。 - -h :在顯示符合範本樣式的那一列之前,不表示該列所屬的文件名稱。 - -H :在顯示符合範本樣式的那一列之前,表示該列的文件名稱。 - -i :忽略字符大小寫的差別。 - -l :列出文件內容符合指定的範本樣式的文件名稱。 - -L :列出文件內容不合符指定的範本樣式的文件名稱。 - -n :在顯示符合範本昂是的那一行之前,並打印行號。 - -q :不顯示任何信息。 - -R / -r :此參數的效果和指定"-d recurse" 一樣,遞歸查找的意思。 - -s :不顯示錯誤信息。 - -v :反轉查找。 - -w :只顯示全字符合的列(全字匹配)。 - -x :只顯示全列符合的列。 - -y :此參數效果跟"-i" 相同。 - -o :只輸出文件中匹配到的部分。 - -Z : --null print 0 byte after FILE name
grep 命令常見用法
在文件中搜索一個單詞,命令會返回一個包含"match_pattern"的文本行:
grep match_pattern file_name
grep "match_pattern" file_name
在多個文件中查找:
grep "match_pattern" file_1 file_2 file_3 ...
輸出除了‘match_pattern’之外的所有行 -v選項:
grep -v "match_pattern" file_name
標記匹配顏色 --color=auto 選項:
grep "match_pattern" file_name --color=auto
使用正則表達式-E選項:
grep -E "[1-9]+" test.txt #匹配文件裏的所有數字
或者
egrep "[1-9]+" test.txt
例子:
[root@ceshi grep]# echo "this 1 is 2 a 3 test 4 line." | grep -o -E "[1-9]+"
1
2
3
4
只輸出文件中匹配到的部分-o 選項:
[root@ceshi grep]# echo "this is a test line." | grep -o -E "[a-z]+\." line. 或者 [root@ceshi grep]# echo "this is a test line." | egrep -o "[a-z]+\." line.
統計文件或者文本中包含匹配字符串的行數-c 選項:
[root@ceshi grep]# grep -c "a" test.txt
2
輸出包含匹配字符串的行數,並打印行號 -n 選項:
[root@ceshi grep]# grep -n "a" test.txt
1:aaaaaaaaaa
2:aaaaaaaaaa
或者
[root@ceshi grep]# cat test.txt | grep "a" -n
1:aaaaaaaaaa
2:aaaaaaaaaa
多個文件查找:
[root@ceshi grep]# grep -n "a" test.txt test2.txt
test.txt:1:aaaaaaaaaa
test.txt:2:aaaaaaaaaa
test2.txt:1:aaaaaaaaaa
test2.txt:2:aaaaaaaaaa
打印匹配到的字符所在的字符位置(字節偏移)和字符:
[root@ceshi grep]# echo "this is a test line." | grep -b -o "test"
10:test
#一行中字符串所在的位置從該行的第一個字符開始計算,起始值為0;選項-b -o 一般總是配合使用。
搜索多個文件並查找匹配文本在那些文件中:
#搜索文件內容包含a 的文件名都打印出來
[root@ceshi grep]# grep -l "a" test.txt test2.txt
test.txt
test2.txt
grep遞歸搜索文件
在多級目錄中對文本進行遞歸搜索:
[root@ceshi grep]# grep "a" . -r -n
./test.txt:1:aaaaaaaaaa
./test.txt:2:aaaaaaaaaa
./test2.txt:1:aaaaaaaaaa
./test2.txt:2:aaaaaaaaaa
或者
[root@ceshi grep]# grep "a" . -d recurse -n
./test.txt:1:aaaaaaaaaa
./test.txt:2:aaaaaaaaaa
./test2.txt:1:aaaaaaaaaa
./test2.txt:2:aaaaaaaaaa
# .代表當前目錄
# -r 、-R、-d recurse 都是遞歸查找的意思
忽略匹配樣式中的字符大小寫:
[root@ceshi grep]# echo "Hello WorlD" | grep -i "hello"
Hello
選項-e指定多個匹配樣式:
例1:
[root@ceshi grep]# echo "this is a text line" | grep -e "is" -e "line" -o
is
is
line
[root@ceshi grep]# echo this is a text line | grep -e "is" -e "line" -o -w
is
line
# -w:全自符匹配,也就是完全匹配字符串,而不是模糊匹配
例2:
#也可以使用-f選項來匹配多個樣式,在樣式文件中逐行寫出需要匹配的字符。
[root@ceshi grep]# cat test3.txt
aaa
aaaa
111
bbb
22222222222
bbbb
6666666666
ccc
cccc
#匹配出test3.txt 文件中包含 aaa bbb ccc ddd的字符
[root@ceshi grep]# echo "aaa bbb ccc ddd
" | grep -f test3.txt -o
aaa
bbb
ccc
#由於test3.txt中沒有ddd,所有沒有匹配到,也沒有被打印。
在grep搜索結果中包括 或者 排除指定文件:
#在目錄中查找所以.php和.html文件中遞歸搜索字符"main()"
grep "main()" . -r --include *.{php,html}
#在搜索結果中排除所有README文件
grep "main()" . -r --exclude "README"
#在搜索結果中排除filelist文件列表裏的文件
grep "main()" . -r --exclude-from filelist
使用0值字節後綴的grep與xargs
[root@ceshi grep]# echo "aaa" > file1
[root@ceshi grep]# echo "bbb" > file2
[root@ceshi grep]# echo "ccc" > file3
#在所有file開頭文件中查找包含“aaa”的文件,然後刪除匹配文件
[root@ceshi grep]# grep "aaa" file* -lZ | xargs -0 rm
[root@ceshi grep]# ls
a.php b.html file2 file3 test2.txt test3.txt test.txt
#執行後file1倍刪除掉了。
#grep 輸出用-Z 選項來指定以0值字節作為終結符文件名(\0)
#xargs -0來讀取輸入並用0值字節終結符 分隔文件名,然後刪除匹配文件,-Z和-l 通常聯合使用。
grep靜默輸出:
[root@ceshi grep]# grep -q "test" file2
[root@ceshi grep]# echo $?
1
#-q 不顯示任何信息;如果命令運行成功返回0,失敗則非0,一般用於條件測試。
#用echo $? 測試 條件成功與否。
打印出匹配文本之前或者之後的行:
#顯示匹配某個結果之後的3行,使用-A 選項:
[root@ceshi grep]# seq 10 | grep "5" -A 3
5
6
7
8
#顯示匹配某個結果之前的3行,使用-B 選項:
[root@ceshi grep]# seq 10 | grep "5" -B 3
2
3
4
5
#顯示匹配某個結果前3行和後3行,使用-C 選項:
[root@ceshi grep]# seq 10 | grep "5" -C 3
2
3
4
5
6
7
8
egrep命令
egrep也是在文件內查找指定的字符串。egrep類似grep -E 使用效果,使用語法及參數 參考grep指令,與grep不同點在於 解讀字符串的方法。
(grep -E :將範本樣式為延伸的普通表示法來使用,意味著能使用擴展正則表達式。)
egrep解讀方法:extended regular expression
grep的解讀方法:basic regular expression
前者比後者表達更規範。
第十六章 在文件中搜索文本工具:grep命令 和egrep命令