欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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]
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]
相关标签: grep