grep的用法以hh.txt文本为例内容如下

123456   abcedf

abcdef   123456
123456   abcedf
abcdef   123456
123456   abcedf
abcdef   123456
123456   abcedf
abcdef   123456
123456   abcedf
abcdef   123456
123456   abcedf
abcdef   123456

(一)基础正则表达式

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep在数据中查找出一个字符串时,是以整行为单位来进行数据选取的。

(1) grep不加参数,匹配$1的内容。

grep 'abc' hh.txt

或 cat hh.txt | grep 'abc'

(2) 参数[acinv]

-a 以文本文件方式搜索

-c 计算找到的符合行的次数

grep -c 'abc' hh.txt #匹配含abc的行并统计匹配次数

-i 忽略大小写

grep -i 'aBc' hh.txt #匹配含aBc的行,忽略大小写

-n 顺便输出行号

grep -n 'abc' hh.txt #匹配含abc的行并输出行号

-v 反向选择,即找 没有搜索字符串的行

grep -v 'abc' hh.txt #匹配不含abc的行

其中搜索串可以是正则表达式!

(2) grep 正则匹配

grep '[w2]' hh.txt #匹配含有w或2字符的行

grep '[^a]bc' hh.txt #匹配bc前除了a的行

grep '[^ab]c' hh.txt #匹配c前除了ab的行

grep '[0-9]' hh

.txt #匹配0-9范围的行

grep '[a-z]' hh.txt #匹配a-z范围的行

grep '[a-zA-Z0-9]' hh.txt #匹配a-z或A-Z或0-9范围的行,即所有数字与英文字符

1) ^ 表示行的开头,$表示行的结尾( 不是字符,是位置)那么‘^$’ 就表示空行,因为只有行首和行尾。

grep '^a' hh.txt #匹配a开头的行

grep 'c$' hh.txt #匹配c结尾的行

grep -n '^$' hh.txt #匹配空行并打印行号

grep -v '^$' hh.txt #匹配非空行,也可-vn匹配并打印行号

grep -n '^[a-z]' hh.txt #匹配以小写字符开头的行

grep '^[^a-zA-Z]' hh.txt或 grep -v '^[a-zA-Z]' hh.txt #匹配开头不是英文字符的行

grep '\.' hh.txt #匹配含.字符的行,\.为.字符的转义

2) 任意一个字符. 与重复字符 *

(在bash中*代表通配符,用来代表任意个 字符,但是在正则表达式中,他含义不同,*表示有0个或多个 某个字符。

例如 oo*, 表示第一个o一定存在,第二个o可以有一个或多个,也可以没有,因此代表至少一个o.

点. 代表一个任意字符,必须存在。*代表*前字符,*多与.全用,如.*表示 0个或多个任意字符)

grep -n '^a.*3' hh.txt #匹配a开头3结尾的字符串所在的行

3) 限定连续重复字符的范围 { }

. * 只能限制0个或多个, 如果要确切的限制字符重复数量,就用{范围} 。范围是数字用,隔开 2,5 表示2~5个,

2表示2个,2, 表示2到更多个
注意,由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用\转义一下。

grep -n 'l\{2\}' hh.txt #匹配含有两个ll的行

grep -n 'el\{2\}o' hh.txt #匹配e后面跟两个l再跟一个o的行

grep -n 'el\{2,5\}o' hh.txt #匹配e后面跟2到5个l再跟一个o的行

 

附注:

1) 注意在MS的系统下生成的文本文件,换行会加上一个 ^M 字符。

所以最后的字符会是隐藏的^M ,在处理Windows下面的文本时要特别注意!

可以用cat dos_file | tr -d '\r' > unix_file 来删除^M符号。 ^M==\r

2) 注意,相让[]中的^ - 不表现特殊意义,可以放在[]里面内容的后面。

'[^a-z\.!^ -]' 表示没有小写字母,没有. 没有!, 没有空格,没有- 的 串,注意[]里面有个小空格。

3) 另外shell 里面的反向选择为[!range], 正则里面是 [^range]

(二) 扩展正则表达式

扩展正则表达式是对基础正则表达式添加了几个特殊构成的。

它令某些操作更加方便。
比如我们要去除 空白行和行首为 #的行, 会这样用:

grep -v '^$' hh.txt | grep -v '^#'

然而使用支持扩展正则表达式的 egrep 与扩展特殊符号 | ,会方便许多。

注意grep只支持基础表达式, 而egrep 支持扩展的, 其实 egrep 是 grep -E 的别名而已。因此grep -E 支持扩展正则。

egrep -v '^$|^#' hh.txt #这里| 表示或的关系。 即满足 ^$ 或者 ^# 的字符串。|左右均无空格

附注:

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

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