现在的位置: 首页 > 综合 > 正文

linux之grep命令

2018年05月07日 ⁄ 综合 ⁄ 共 1881字 ⁄ 字号 评论关闭

        grep的一般格式为: 

               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

抱歉!评论已关闭.