grep [选项] pattern [文件]
单引号和双引号:
1)在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“my strings”,这样做有两个原因,一个是防止被误会是shell命令,一个是可以用来查找多个单词组成的字符串,就如这个例子中的“my strings”。
2)在调用变量的时候,也应该使用双引号,例如:grep “$MYNAME”。
3)在调用模式匹配(正则表达式)时,应该使用单引号。
egrep和grep
egrep: 为 grep 的扩充版本, 改良了许多传统 grep 不能或不便的操作. 比方说:
- grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
- grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
- grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.
所以能用egrep就不用grep啦... ^_^ ,可以加选项 -E 来使grep具有egrep的功能
关于egrep和grep在正则方面的区别,请参考文章各种工具之正则表达式语法比较
返回状态:匹配:0 不匹配:1 文件不可访问或语法错误:2
◎参数
1:-A NUM :除了列出符合行之外,并且列出后NUM行。 ex: $ grep -A 1 panda file
2:-B NUM 与 -A NUM 相对,显示除符合行之外,并显示在它之前的NUM行。
3:-C [NUM], 列出符合行之外并列出上下各NUM行,预设值是2。 可以直接写为 -n,如:grep -5 pattern filename同时显示匹配行的上下5行。
4:-c, --count 不显示符合样式行,只显示符合的总行数。 若再加上-v,显示不符合的总行数。
5. -f file 读取文件file,该文件的每一行都包含一个模式,从输入中查找匹配每个模式的行
6. -r 文件夹 递归的搜索该文件夹中的目录,处理目录中的每个文件
7. -h, --no-filename 当搜索多个文件(-r 文件夹),在输出时不显示文件路径及名称。 注:不加-h,就是默认的时候,是显示文件名的,若是只是一个文件,则默认不显示(一个的话你肯定指定了,你都知道了还显示什么呢?)
8. -I (小写字母 l ) 只显示包含匹配的文件的文件名,且无论匹配多少次,只显示文件名一次。若是 -L,则是显示不匹配的文件名
9. -i, --ignore-case 忽略大小写
0. -n, --line-number 在匹配的每行前,标上行号。
1. -q, --quiet, --silent 不发送任何内容到标准输出,仅设置退出码。
2. -v, --invert-match 显示不匹配的行。
3. -w, --word-regexp 完全匹配模式,完全匹配该"字"的行才会被列出。
4. -x, --line-regexp 整行匹配,完全符合该"行"的行才会被列出
正则表达式:
^ 匹配正则表达式的开始行
$ 匹配正则表达式的结束行
< 从匹配正则表达式的行开始
> 到匹配正则表达式的行结束
[ ] 单个字符;如[A] 即A符合要求
[ - ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求
. 所有的单个字符
* 所有字符,长度可以为0
注意:有必要参考上文提到的各种工具之正则表达式语法比较 特别是grep和egrep还不太一样。
实例:
-
$ ls -l | grep '^a'
- 通过管道过滤ls -l输出的内容,只显示以a开头的行。 $ grep 'test' d*
- 显示所有以d开头的文件中包含test的行。 $ grep 'test' aa bb cc
- 显示在aa,bb,cc文件中匹配test的行。 $ grep '[a-z]\{5\}' aa
- 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。 $ grep 'w\(es\)t.*\1' aa
- 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成'w(es)t.*\1'就可以了。
-
- grep的全字匹配:
- grep -w 80