在日志文件中选择搜索表达式下面的行

时间:2013-05-24 17:33:22

标签: bash shell unix command-line

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

实施例

我知道我想要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 行?我看到一些可能比其他人更容易......

5 个答案:

答案 0 :(得分:2)

awk 'p { print; p=0  }
    /CommonTerm/ { p=1 }' file

答案 1 :(得分:1)

怎么样:

grep -B 0 -A 1 "CommonTerm" log_file | grep -v "^CommonTerm:" | grep -v "^--$"

答案 2 :(得分:1)

我用awk做这个:

awk 'found{found=0;print;next}/CommonTerm/{found=1}'

答案 3 :(得分:1)

您可以使用sed

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

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

编辑:根据评论主题,如果你使用BSD sed而不是GNU sed(可能是OS X的情况),你需要几个额外的分号来绕过一个错误:

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

答案 4 :(得分:0)

对于那些安装了pcregrep的用户,可以一次性完成。请注意使用\K重置比赛的起点

pcregrep -Mo 'CommonTerm.*?\n\K.*?(?=\n)' file