grep命令


grep(global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。


 

 

-a 不要忽略二進制數據。

-A<顯示列數> 除了顯示符合范本樣式的那一行之外,並顯示該行之后的內容。

-b 打印樣式匹配所位於的字符或字節偏移

-B 在顯示符合范本樣式的那一行之外,並顯示該行之前的內容。

-c 計算符合范本樣式的列數。

-C<顯示列數>或-<顯示列數> 除了顯示符合范本樣式的那一列之外,並顯示該列之前后的內容。

-d<進行動作> 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將回報信息並停止動作。

-e<范本樣式> 指定字符串作為查找文件內容的范本樣式。

-E 將范本樣式為延伸的普通表示法來使用,意味着使用能使用擴展正則表達式。

-f<范本文件> 指定范本文件,其內容有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每一列的范本樣式。

-F 將范本樣式視為固定字符串的列表。

-G 將范本樣式視為普通的表示法來使用。

-h 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。

-H 在顯示符合范本樣式的那一列之前,標示該列的文件名稱。

-i 忽略字符大小寫的差別。

-l 列出文件內容符合指定的范本樣式的文件名稱。

-L 列出文件內容不符合指定的范本樣式的文件名稱。

-n 在顯示符合范本樣式的那一列之前,標示出該列的編號。

-q 不顯示任何信息。

-R/-r 此參數的效果和指定“-d recurse”參數相同。  在多級目錄中對文本進行遞歸搜索

-s 不顯示錯誤信息。

-v 反轉查找。

-w 只顯示全字符合的列。

-x 只顯示全列符合的列。

-y 此參數效果跟“-i”相同。

-o 只輸出文件中匹配到的部分。


  a.txt文件

a
bb
ccc
dddd
1a
2b
3d
4a
5a
-A 1 表示找到所有匹配行,並顯示所有匹配行后的一行 在錯誤日志查找時還是很有用 $ grep -A 1 b a.txt
bb                //找到b了
ccc              //顯示bb這一行的后面一行
--
2b
3d

-B 1 表示找到所有匹配行,並顯示所有匹配行的前面一行 $ grep -B 1 b a.txt
a
bb             //匹配到b了,把bb這一行到前一行也顯示出來
--
1a
2b

-C 1表示找到所有匹配行,並顯示所有匹配行的前一行,后一行 $ grep -C 1 b a.txt
a
bb             //匹配到b了,把a,ccc前后一行也顯示出來
ccc
--
1a
2b
3d

-a 不要忽略二進制數據 表示把所有文件當作ASCII文件來處理 搜索二進制文件
//a.pcap是一個tcpdump生成的文件,為binary文件,使用grep不能搜索

$ grep "HOST" a.pcap
Binary file a.pcap matches

$ grep -a "HOST" a.pcap
HOST: 239.255.255.250:1900
HOST: 239.255.255.250:1900

-b 表示顯示match的字符串在文件中的offset (標示出該行第一個字符的編號) $grep -b a a.txt
0:a
14:1a        //表示這一行的a在文件中的offset為14
23:4a
26:5a
 
        
-c 顯示有多少行match的字符串(也就是有4行帶a的)
$grep -c a a.txt 
4
-e 后面跟一個正則表達式,指定多個正則表達式的時候很有用 $grep -e [a] -e [0-2] a.txt //匹配a 或者0,1,2 

   a
   1a
   2b
   4a
   5a

 

pattern.txt

   a
   b
   0
   2

-f可以指定pattern在我們的文件中 pattern文件中的每一行都會來進行匹配
$grep -f pattern.txt a.txt

   a
   bb
   1a
   2b
   4a
   5a

 

-m 最多匹配幾個后,就停止,這樣速度會比較快 $ grep -m 2 a a.txt
a
1a

-n 匹配之后,在前面打印行號,這個還是有用的 $ grep -n a a.txt
1:a
5:1a
8:4a
9:5a

-o 只打印匹配的內容 $ grep -o a a.txt
a
a
a
a
 
        
//只能搜索當前目錄 $grep a *
a.txt:a
a.txt:1a
a.txt:4a
a.txt:5a
b.txt:aaa
grep: cc: Is a directory      //碰到一個目錄了

$grep -R a * //搜索子目錄
a.txt:a
a.txt:1a
a.txt:4a
a.txt:5a
b.txt:aaa
cc/b.txt:a                  //這個目錄也找到了
 
        
-v invert查找 下面為在a.txt中,查找不包含"a"的行 這個命令會經常使用 $ grep -v a a.txt
bb
ccc
dddd
2b
3d
2

-w 查找一個詞

word.txt
it is a good day   //分成五個詞,分別是it , is, a, good, day
itis a goodday     //分成三個詞,分別是itis, a,  goodday

$ grep -w it word.txt   
it is a good day

$ grep -w good word.txt
it is a good day

^pattern 表示開頭處開始匹配
grep "^i" word.txt 

 it is a good day
   itis a goodday


grep "^is" word.txt //因為is不在行的開始處,所以沒有匹配上


pattern$ 從結尾處匹配     
grep "is$" word.txt  . 為匹配任意單個字符 $ echo "it is" |grep "." it is $echo "it is" |grep "a." ".*" 匹配任意長度的任意字符 $ echo "it is" |grep ".*" it is $ echo "#" |grep ".*" //匹配任意字符,所以#也可以匹配 # "r.*h" //匹配一個字符串,其中有r,有h,且r在前,h在后,且r和h之間可以間隔任意長度的任意字符串,當然也可以沒有間隔 $ echo "redhat" |grep "r.*h" redhat $ echo "rh" |grep "r.*h" rh $ echo "redhat" |grep "r.*b" "^r.*h$" //匹配一個字符串,其中r是第一個字符,h是最后一個字符,且r和h之間可以間隔任意長度的任意字符串,當然也可以沒有間隔 $ echo "rh" |grep "^r.*h$" rh $ echo "redh" |grep "^r.*h$" redh $ echo "redhat" |grep "^r.*h$" //這里匹配不上 匹配指定范圍內的任意字符 [e] 匹配任意單個字符 $ echo "redh" |grep "[e]" redh $ echo "redh" |grep "[s]" 匹配指定范圍內的任意字符 [eh] 匹配e或h $ echo "redh" |grep "[eh]" redh $ echo "redh" |grep "[sh]" redh 匹配指定范圍內的任意字符 [a-z],[1-3a-b] [1-3a-bX-Z] $ echo "redh" |grep "[a-d]" redh $ echo "redh" |grep "[d-f]" redh $ echo "redh" |grep "[d-a]" grep: invalid character range $ echo "redh" |grep "[f-f]" $ echo "redh" |grep "[a-z]" redh $ echo "redX" |grep "[x-x]" $ echo "redX" |grep "[X-X]" redX $ echo "redX" |grep "[a-Z]" grep: invalid character range $ echo "16" |grep "[1-2]" 16 $ echo "16" |grep "[5-8]" 16 $ echo "16" |grep "[1-9a-z]" 16 $ echo "b" |grep "[1-9a-z]" b $ echo "1xX" |grep "[1-1x-zX-X]" 1xX //[^] 匹配指定范圍外的字符 $ echo "1" |grep "[^1-3]" //匹配非[1-3]的,不能匹配上 $ echo "2" |grep "[^1-3]" //匹配非[1-3]的,不能匹配上 $ echo "3" |grep "[^1-3]" //匹配非[1-3]的,不能匹配上 $ echo "4" |grep "[^1-3]" //匹配非[1-3]的,能匹配上 4 $ echo "a" |grep "[^1-3]" //匹配非[1-3]的 a $echo "a" |grep "[^1-3a-b]" $echo "a" |grep "[^1-3a-b]" //匹配非[1-3],非[a-b]的 ,匹配不上 $echo "c" |grep "[^1-3a-b]" //匹配非[1-3],非[a-b]的 ,匹配不上 c $echo "4" |grep "[^1-3a-b]" //匹配非[1-3],非[a-b]的 ,能匹配上 4 [[:space:]] 匹配空白字符 $ echo "a"|grep "[[:space:]]" $ echo "a b"|grep "[[:space:]]" a b \? 表示匹配前面的字符串0次或1次 $ echo "z"|grep "z\(a\?\)" z $ echo "za"|grep "z\(a\?\)" za $ echo "ab"|grep "z\(a\?\)" //不匹配 {m,n} 匹配前面的字符串m到n次 $ echo "aa"|grep "a\{1,3\}" //匹配a,aa,aaa aa $ echo "aa"|grep "a\{2,3\}" aa $ echo "aa"|grep "a\{3,4\}" //不匹配 {2,} 匹配前面的字符串至少兩次 $ echo "aa"|grep "a\{1,\}" aa $ echo "aa"|grep "a\{2,\}" aa $ echo "aa"|grep "a\{3,\}" //不匹配 \<pattern1必須以pattern1開頭 \pattern2> 必須以pattern2結尾 $ echo "redhat"|grep "\<r[1-9]*" redhat="" $="" echo="" "redhat"|grep="" "[a-z]*t\="">" redhat $ echo "redhat"|grep "\<r[a-z]*t\>" redhat $ echo "zredhat"|grep "\<r[a-z]*t\>" //不匹配 $ echo "redhat"|grep "\<r[1-9]*t\>" //不匹配 $ echo "redhat"|grep "^r[a-z]*t$" //相當於這個 redhat () 用來進行分組, 下面這個就是匹配帶有re和rea的 $ echo "redhat"|grep "\(re\)\(a\?\)" redhat $ echo "zedhat"|grep "\(re\)\(a\?\)" //匹配不上 \+ 表示匹配前面的字符串一次或多次 $ echo "zredhat"|grep "\(re\)\(d\+\)" //匹配red,redd,reddd,redddd,... zredhat $ echo "zrehat"|grep "\(re\)\(d\+\)" //匹配不上 \| 表示或的關系 $ echo "d"|grep "\(re\)\|\(d\+\)" //匹配re 或者d,dd,ddd.. d $ echo "re"|grep "\(re\)\|\(d\+\)" re $ echo "a"|grep "\(re\)\|\(d\+\)" //沒有匹配上
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM