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\+\)" //没有匹配上