grep

作者: jiangmo | 来源:发表于2018-12-13 10:53 被阅读8次

主要作用:过滤指定关键词(支持正则匹配)

命令格式:grep [-cinvABC] ‘word' filename

常用选项含义表示如下:

  • -c:表示打印符合要求的行数。

  • -i:表示忽略大小写。

  • -n:表示输出符合要求的行及其行号。

  • -v:表示打印不符合要求的行,取反。

  • -r:遍历所有子目录

  • -A:后面跟一个数字(有无空格都可以),例如-A2表示打印符合要求的行以及下面的两行。

  • -B:后面跟一个数字,例如-B2表示打印符合要求的行以及上面两行。

  • -C:后面跟一个数字,例如-C2表示打印符合要求的行以及上下各两行。

在正则表达式中,^ 表达行的开始,$表示行的结尾那么空行则可以用^$表示。

// //过滤掉所有空行和以#开头的行
grep -v '^#' inittab |grep -v  '^$'  

// 打印出不以英文字开头的行
grep '^[^a-zA-Z]' test.txt 

用法举例

搜索有the的行,并输出行号
$grep -n 'the' test.txt
搜 索没有the的行,并输出行号
$grep -nv 'the' test.txt

[]搜索集合字符
[] 表示其中的某一个字符 ,例如[ade] 表示a或d或e
$ grep -n 't[ae]st' test.txt 
可匹配含有tast或者test的行

可以用^符号做[]内的前缀,表示除[]内的字符之外的字 符。
比如搜索oo前没有g的字符串所在的行. 使用 '[^g]oo' 作搜索字符串
grep -n '[^g]oo' test.txt 

[] 内可以用范围表示,比如
[a-z] 表示小写字母
[0-9] 表示0~9的数字
[A-Z] 则是大写字母们
[a-zA-Z0-9]表示所有数字与英文字符
当然也可以配合^来排除字符。


行首与行尾字符 ^ $. 
^ 表示行的开头,$表示行的结尾( 不是字符,是位置)
那么‘^$’ 就表示空行,因为只有行首和行尾。
注意:这里^与[]里面使用的^意义不同。它表示^后面的串是在行的开头

注意在MS的系统下生成的文本文件,换行会加上一个 ^M 字符。
所以最后的字符会是隐藏的^M ,在处理Windows
下面的文本时要特别注意!
可以用cat dos_file | tr -d '/r' > unix_file 来删除^M符号。 ^M==/r

任意一个字符  “.” 
与重复字符   “*”

在bash中*代表通配符,用来代表任意个 字符
但是在正则表达式中,他含义不同,*表示有0个或多个 某个字符
如oo*
bash中:oo开头,后面任意多个字符(也可没有)
正则中:开头的o是第一个含义A,o*是第二个含义B
A表示o开头,B表示没有o或者任意多个o

如:搜索g开头和结尾,中间是至少一个o的字符串,即gog, goog....gooog...等
grep -n 'goo*g' test.txt 

搜索g开头和结尾的字符串在的行
grep -n 'g.*g' regular_express.txt     // .*表示 0个或多个任意字符

限定连续重复字符的范围 { } 
. * 只能限制0个或多个, 如果要确切的限制字符重复数量,就用{范围} 
范围是数字用,隔开 {2,5} 表示2~5个,
{2}表示2个,{2,} 表示2到更多个
注意:由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用/转义一下。

如:搜索包含两个o的字符串的行
grep -n 'o/{2/}' text.txt 

搜索g后面跟2~5个o,后面再跟一个g的字符串的行
grep -n 'go/{2,5/}g' text.txt

egrep工具

egrep工具是grep工具的扩展版本,可以完成grep不能完成的工作

egrep 'o+' test.txt 
egrep '0{2}' passwd 

grep 'o.*' test.txt 
grep '0\{2\}' passwd 

//egrep中()的应用
egrep 'r(oo|at)o' test.txt 
// 用()表示一个整体,上例中会把包含rooo或者rato的行过滤出来

要去除 空白行和行首为 #的行
grep -v '^$' regular_express.txt | grep -v '^#'
egrep -v '^$|^#' regular_express.txt 

和grep不同,egrep使用的是符号+,它表示匹配1个或多个+前面的字符,这个“+”,grep是不支持直接使用的,包括上面{},也是可以直接被egrep使用,而不用加\转义

这里列出几个扩展特殊符号:

  • +, 于 . * 作用类似,表示 一个或多个重复字符。
  • ?, 于 . * 作用类似,表示0个或一个字符。
  • |,表示或关系,比如 'gd|good|dog' 表示有gd,good或dog的串
  • (),将部分内容合成一个单元组。 比如 要搜索 glad 或 good 可以这样 'g(la|oo)d'
    • ()的好处是可以对小组使用 + ? * 等。
    • 比如要搜索A和C开头结尾,中间有至少一个(xyz) 的串,可以这样 : 'A(xyz)+C'

Ref:
http://blog.51cto.com/taoxie/1983586

相关文章

网友评论

      本文标题:grep

      本文链接:https://www.haomeiwen.com/subject/lklvhqtx.html