赵家小少爷 2019-12-04
[ ~]# grep -n ‘the‘ test.txt
[ ~]# grep -in ‘the‘ test.txt
若反向选择,如查找不包含“the”字符的行,则需要通过 grep 命令的“-vn”选项实现。
[ ~]# grep -vn ‘the‘ test.txt
利用中括号“[]”来查找集合字符
想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh” 与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串。“[]”中无论有几个字符,都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”。
[ ~]# grep -n ‘sh[io]rt‘ test.txt
若要查找包含重复单个字符“oo”时,只需要执行以下命令即可。
[ ~]# grep -n ‘oo‘ test.txt
若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的,如执行“grep –n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo” 前面不是“w”的字符串。
[ ~]# grep -n ‘[^w]oo‘ test.txt
在上述命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,二者均包含“w”。其实通过执行结果就可以看出,符合匹配标准的字符加粗显示,而上述结果中可以得知,“#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理 “#woooooood #”也符合匹配规则。
若不希望“oo”前面存在小写字母,可以使用“grep –n‘[^a-z]oo’test.txt”命令实现,其中“a-z”表示小写字母,大写字母则通过“A-Z”表示。
[ ~]# grep -n ‘[^a-z]oo‘ test.txt
[ ~]# grep -n ‘[^a-zA-Z]oo‘ test.txt
过滤以a-z,A-Z开头的字符串
查找包含数字的行可以通过“grep –n‘[0-9]’test.txt”命令来实现。
[ ~]# grep -n ‘[0-9]‘ test.txt
查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中,查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现。
[ ~]# grep -n ‘^the‘ test.txt
[ ~]# grep -n ‘\.$‘’ test.txt
当查询空白行时,执行“grep –n‘^$’test.txt”命令即可。
[ ~]# grep -n ‘^$‘ test.txt
查找任意一个字符“.”与重复字符“*”
[ ~]# grep -n ‘w..d‘ test.txt
“”代表的是重复零个或多个前面的单字符。“o”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep –n‘o’test.txt”命令会将文本中所有的内容都输出打印。如果是“oo”, 则第一个 o 必须存在,第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准。同理,若查询包含至少两个 o 以上的字符串,则执行“grep –n‘ooo*’ test.txt”命令即可。
[ ~]# grep -n ‘ooo*‘ test.txt
查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现。
[ ~]# grep -n ‘woo*d‘ test.txt
查询以 w 开头 d 结尾,中间的字符可有可无的字符串。
[ ~]# grep -n ‘w.*d‘ test.txt
查询任意数字所在行
[ ~]# grep -n ‘[0-9][0-9]*‘ test.txt
查找连续字符范围“{}”
在上面的示例中,我们使用“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊 意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。 “{}”字符的使用方法如下所示。
查询两个 o 的字符:
[ ~]# grep -n ‘o\{2\}‘ test.txt
查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
[ ~]# grep -n ‘wo\{2,5\}d‘ test.txt
查询以 w 开头以 d 结尾,中间包含 2 以上 o 的字符串
[ ~]# grep -n ‘wo\{2,\}d‘ test.txt
元字符总结
扩展正则表达式
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。例如,使用基础正则表达式查询除文件中空白行与行首为“#” 之外的行(通常用于查看生效的配置文件),执行“grep –v‘^$’test.txt | grep –v ‘^#’”即可实现。这里需要使用管道命令来搜索两次。如果使用扩展正则表达式,可以简化为“egrep –v‘^$|^#’test.txt”,其中,单引号内的管道符号表示或者(or)。
此外,grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的小节进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。egrep 命令是一个搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字或一个句子。
与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达
式的元字符主要包括以下几个