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