当前目录在很多配置文件,现在想要查找参数actConfDlInterferenceGen不是none的,怎么做?
<p name="actConfDlInterferenceGen">none</p>
有两种方式实现,对比看出正则表达式要慢一些:
第一种是用正则表达式
$ time grep -inrE 'actConfDlInterferenceGen\">[^(none)]'
xxx.xml:1309: <p name="actConfDlInterferenceGen">PDSCH</p>
real 0m3.972s
user 0m3.614s
sys 0m0.352s
第二种是分两次查找,首先查包含参数"actConfDlInterferenceGen"的所有内容,然后利用管道把输出去掉带有"none"字符串的。
time grep -inr 'actConfDlInterferenceGen' |grep -v none
$ time grep -inr 'actConfDlInterferenceGen' |grep -v none
xxx.xml:1309: <p name="actConfDlInterferenceGen">PDSCH</p>
real 0m2.874s
user 0m2.507s
sys 0m0.357s
grep 命令选项有:
-c 只输出匹配行的个数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
-V 显示软件版本信息
使用grep匹配时最好用单引号引起来,如果是双引号,带“!”号的表达式会报命令错误
$ time grep -inrE "actConfDlInterferenceGen\">![^(none)]"
-bash: ![: event not found
通过参数-E支持扩展正则表达式,另外grep单独提供了一个扩展命令叫做egrep用来支持扩展正则表达式,这条命令和grep -E等价。
grep正则表达式元字符集:
^ 锚定行的开始
$ 锚定行的结束
. 匹配一个非换行符的字符
* 匹配零个或多个先前字符
[] 匹配一个指定范围内的字符
[^] 匹配一个不在指定范围内的字符
\ 锚定单词的开始,如:'\匹配包含以grep开头的单词的行。
\> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} 重复字符x,m次
x\{m,\} 重复字符x,至少m次
x\{m,n\}重复字符x,至少m次,不多于n次
\w 匹配文字和数字字符,也就是[A-Za-z0-9]
\b 单词锁定符,如: '\bgrep\b'只匹配grep。