grep是我们最常用的命令之一,但是正真用的熟的不多,把基础命令记牢固,能帮我们节约很多时间
grep的option
$cat 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 $grep -c a a.tx 4 --color 是把match的字符用不同颜色标示出来 #grep --color a a.txt a 1a 4a 5a -e 后面跟一个正则表达式,指定多个正则表达式的时候很有用 $grep -e [a-c] -e [0-2] a.txt //匹配a,b,c 或者0,1,2 a bb ccc 1a 2b 4a 5a 2 -f可以指定pattern在我们的文件中 pattern文件中的每一行都会来进行匹配 $ cat pattern.txt a 2 $ cat a.txt a bb ccc dddd 1a 2b 3d 4a 5a 2 $grep -f pattern.txt a.txt a 1a 2b 4a 5a 2 -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 -R 搜索子目录 $ll total 208 -rw-r--r-- 1 * * 91868 5 1 23:05 a.pcap -rw-r--r-- 1 * * 31 5 2 22:39 a.txt -rw-r--r-- 1 * * 4 5 1 23:18 b.txt drwxr-xr-x 3 * * 102 5 4 18:58 dir1 //这是一个目录 -rw-r--r-- 1 * * 4 5 4 18:49 pattern.txt //只能搜索当前目录 $grep a * Binary file a.pcap matches a.txt:a a.txt:1a a.txt:4a a.txt:5a b.txt:aaa grep: dir1: Is a directory //碰到一个目录了 pattern.txt:a $grep -R a * //搜索子目录 Binary file a.pcap matches a.txt:a a.txt:1a a.txt:4a a.txt:5a b.txt:aaa dir1/b.txt:a //这个目录也找到了 pattern.txt:a -v invert查找 下面为在a.txt中,查找不包含"a"的行 这个命令会经常使用 $ grep -v a a.txt bb ccc dddd 2b 3d 2 -w 查找一个词, #cat 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
grep 正则表达式
^pattern 表示开头处开始匹配 $echo "it is "|grep "^is" //因为is不在行的开始处,所以没有匹配上 $echo "it is "|grep "^i" it is pattern$ 从结尾处匹配 $ echo "it is "|grep "it$" //这个匹配不上 $ echo "it is "|grep "is$" //能匹配上 it is . 为匹配任意单个字符 $ 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 "redX" |grep "[x-X]" //不要欺负计算机 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+)" //没有匹配上
http://www.itshouce.com.cn/linux/linux-grep.html