主要作用:过滤指定关键词(支持正则匹配)
命令格式: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'
网友评论