我正在尝试搜索日志中的表达式,然后选择每个匹配项下方的行。
我知道我想要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 行?我看到一些可能比其他人更容易......
答案 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