Linux系统中grep命令是一种强大的文本搜索工具,它能使用
正则表达式搜索文本,并把匹配的
行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
大多数grep版本是NFA规则引擎,与java一样。
1. 语法
grep [options] pattern [fileName...]
或
grep [options] [-e pattern | -f fileName] [fileName...]
一般使用第一种写法。
支持的常用options如下:
1.1 控制匹配pattern
-i, (全称: --ignore-case) : 正则内容忽略大小写。以行为单位显示,即使一行匹配到多个pattern也是
一行显示。
-v, (--ivert-match): 反检索,只显示不匹配的行,以行为单位显示。
-w, (--word-regexp): 把pattern当做
‘单词’精确匹配。比如匹配'is',那么'this'就不会被匹配到。
-x, (--line-regexp): 显示与指定模式
精确匹配而不含其他字符的行。比如匹配'error'则只匹配单独一行的'error',如果该行除了error之外还有其他字符则不算匹配。
1.2 控制匹配结果的输出pattern
-c, (--count): 之前的pattern默认输出结果都是以原始文本的行为单位显示。这里就不显示行内容,只显示匹配到的行数。
-m NUM, (--max-count=NUM):当匹配到的行数到达NUM行后,就终止匹配。如: grep -m 1 'error' software.test
-o, (--only-matching): 之前正常匹配到的行会把行内容全部输出,即使一行有多个匹配也是在一行内输出。这里
(1)只输出一行中匹配到的部分,
(2)如果匹配到多个部分则换行输出。 这一点很适合统计文件中某个单词之类的出现频率。
-n, (--line-number): 在匹配到的结果前面输出该行在原始文件中的行号。
-A NUM, (--after-context=NUM): 输出正常匹配结果外,再输出匹配行后NUM行,查看上下文。
-B NUM, (--before-context=NUM):输出正常匹配结果外,再输出匹配行前NUM行,查看上下文。
1.3 文件源控制
-r, (--recursive): 前面都是在一个
指定文件名的文件中搜索,
如果想搜索目录,则要指定-r或-R,或-d
递归的搜索该文件夹中的目录,处理目录中的每个文件.等价于-d recurse。
-R, (--dereference-recursive):也是递归搜索目录下的子文件。与-r不完全一样,主要是在处理symbolic links时候的差别,准确差别个人还没有确定。-r与-R在不同shell下也不一样,可以参考 http://unix.stackexchange.com/questions/154599/the-difference-between-r-and-r
-l, (--files-with-matches): 禁止通常的输出;作为替代,打印出每个在通常情况下会产生输出的输入文件的名字。对每个文件的扫描在遇到第一个匹配的时候就会停止。
-L, (--files-without-match): 禁止通常的输出;作为替代,打印出每个在通常情况下不会产生输出的输入文件的名字。对每个文件的扫描在遇到第一个匹配的时候就会停止。
2.补充说明
2.1 单引号和双引号
1)在grep命令中输入
字符串参数时,最好将其用
双引号括起来。例如:“my strings”,这样做有两个原因,一个是防止被误会是shell命令,一个是可以用来查找多个单词组成的字符串,就如这个例子中的“my strings”。
2)在
调用变量的时候,也应该使用
双引号,例如:grep “$MYNAME”。此时如果使用单引号,则会把${var}当做字面本身,而不会解析var变量的值。
3)在调用模式匹配(
正则表达式)时,应该使用
单引号。
2.2 递归查询
要想递归查询所有test结尾的文件夹及其子文件夹可以使用:
grep -ir "error" *test
但如果是想查询所有".log"结尾的文件就
不能使用:
grep -i "error" *.log
这样会报错:*.log: No such file or directory。
因为grep默认查询单个文件,不能递归。只有文件夹才可以递归,所以会匹配通配符。要想达到这个目的,可以使用:
find /destDir -name "*.log" | grep -i "error"
2.3 统计单词出现次数
1)如果只是匹配某个字符串出现的频率
grep -o "error" error.log | wc -w 或 grep -o "error" error.log | wc -l
2)如果是匹配某个"单词"出现的频率
grep -wo "error" error.log | wc -w 或 grep -o "error" error.log | wc -l
这样的话类似"errorLevel"就不会被匹配出来。
参考:
man grep
http://zhumeng8337797.blog.163.com/blog/static/1007689142011350151438/
http://blog.csdn.net/yongan1006/article/details/8134401