Bash Shell缩减搜索结果

Bash Shell缩减搜索结果,搜索返回的结果不符合预期,其中包括许多并不需要的内容。

解决方案

将结果通过管道传给 grep -v 并用表达式描述出你不想看到的内容。

假设你想在日志文件中找出整个 12 月的日志消息。你知道日志文件用字母缩写 Dec 代表 12 月,但不敢肯定总是如此,为了确保找出所有的日志消息,输入下列命令:

grep -i dec logfile

得到的结果却如下所示:

...
error on Jan 01: not a decimal number
error on Feb 13: base converted to Decimal
warning on Mar 22: using only decimal numbers
error on Dec 16 : the actual message you wanted
error on Jan 01: not a decimal number
...

一种快而糙的解决方案是,将第一次得到的结果通过管道传给另一个 grep,由后者过滤掉所有的“decimal”。

grep -i dec logfile | grep -vi decimal

将多个 grep 串联在一起(因为前所未见、出乎意料的匹配会不断出现),逐步过滤搜索结果,直至满意,这种做法并不鲜见。

grep -i dec logfile | grep -vi decimal | grep -vi decimate

讨论

在这种解决方案中,“糙”是指它可能会漏掉一些你本想留下的 12 月的日志消息:如果消息中含有单词“decimal”,那么就会被 grep -v 过滤。

如果谨慎使用,-v 选项非常方便,你只需要记住该排除什么就行了。

对于这个例子,更好的解决方案是使用威力更为强大的正则表达式来匹配月份和日期,查找“Dec”以及紧随其后的一个空格和两个数字。

grep 'Dec [0-9][0-9]' logfile

不过,这种写法往往行不通,因为 syslog 会用一个空格填充单数字日期。要想解决这个问题,可以在第一个字符集中加上一个空格。

grep 'Dec [0-9 ][0-9]' logfile

由于存在内嵌空格,同时为了避免 shell 解释方括号,我们在方括号周围加上了单引号。在任何可能会对 shell 造成困惑的地方使用单引号是一个好习惯。我们可以使用反斜线转义空格,如下所示:

grep Dec\ [0-9\ ][0-9] logfile

但是这种写法不太容易看出待搜索的字符串在哪里结束,文件名从哪里开始。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!