grep

2018-12-13  本文已影响8人  jiangmo

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

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

常用选项含义表示如下:

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

// //过滤掉所有空行和以#开头的行
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使用,而不用加\转义

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

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

上一篇 下一篇

猜你喜欢

热点阅读