1

我正在尝试在日志中搜索表达式,然后选择每个匹配项下方的行。

例子

我知道我想要 CommonText 下面的行,例如给定日志数据:

CommonTerm: something
This Should
random stuff
CommonTerm: something else
Be The
random stuff
more random stuff
CommonTerm: something else
Output Text
random fluff

期望的输出

This Should
Be The
Output Text

当前尝试

目前我可以grep log_file CommonTerm -B 0 -A 1用来获得:

CommonTerm: something
This Should
--
CommonTerm: something else
Be The
--
CommonTerm: something else
Output Text

然后我可以通过管道| grep "\-\-" -B 0 -A 1得到

This Should
--
--
Be The
--
--
Output Text
--

然后通过awk '{if (count++%3==0) print $0;}',给出:

This Should
Be The
Output Text

我的问题是:肯定有一个很好的“unix-y”方法来做到这一点?多 greps 和 hacky awk 感觉很傻……有吗?

编辑:我也试过:

(grep 'CommonTerm:' log_file -B 0 -A 2) | grep "\-\-" -B 1 -A 0 | grep -v "^--$"

但它似乎比预期的下面的答案更笨重;)

编辑:

有一些很好的答案,有什么可以让我轻松选择搜索词后的第 n行吗?我看到一些可能比其他人更容易......

4

5 回答 5

2
awk 'p { print; p=0  }
    /CommonTerm/ { p=1 }' file
于 2013-05-24T17:43:14.340 回答
1

怎么样:

grep -B 0 -A 1 "CommonTerm" log_file | grep -v "^CommonTerm:" | grep -v "^--$"
于 2013-05-24T17:39:46.577 回答
1

我会用 awk 做到这一点:

awk 'found{found=0;print;next}/CommonTerm/{found=1}'
于 2013-05-24T17:41:15.240 回答
1

您可以使用sed

sed -n "/^CommonTerm: /{n;p}" log_file

这会在行首搜索“CommonTerm:” ( ^),然后跳到下一行 ( n) 并打印 ( p)。

编辑:根据评论线程,如果您使用的是 BSDsed而不是 GNU sed(可能是 OS X 上的情况),则需要几个额外的分号来解决错误:

sed -n "/^CommonTerm: /{;n;p;}" log_file
于 2013-05-24T17:42:22.390 回答
0

对于已经pcregrep安装的用户,这可以一次性完成。注意使用\K来重置匹配的起点

pcregrep -Mo 'CommonTerm.*?\n\K.*?(?=\n)' file
于 2013-05-24T18:13:34.487 回答