1. 程式人生 > >第十六章 在文件中搜索文本工具:grep命令 和egrep命令

第十六章 在文件中搜索文本工具:grep命令 和egrep命令

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命令