grep命令:两种方法找不包含某个字符串的内容

当前目录在很多配置文件,现在想要查找参数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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值