如何让“grep”在 grep 行上方显示一行五行?
Posted
技术标签:
【中文标题】如何让“grep”在 grep 行上方显示一行五行?【英文标题】:How can I make 'grep' show a single line five lines above the grepped line? 【发布时间】:2011-09-11 00:00:57 【问题描述】:我在之前和之后看到了一些 grepping 行的示例,但我想忽略中间行。 所以,我想要前五行,但没有别的。 这个可以吗?
【问题讨论】:
问题不清楚,是匹配前5行,还是匹配前5行 复制***.com/questions/9081/… 这条评论来得太晚了,但是问问你自己:一旦你用grep -B5 "foo" file
确定了“参考线”和前五个,除了它是5之外,还有什么关于那条线的诊断吗之前的线?例如,您是否正在寻找特定的错误,并希望返回进程 ID?那么也许grep -B5 "foo" file | grep "bar"
可能是最简单的事情。
【参考方案1】:
好的,我认为这将满足您的需求。它将寻找一个模式,并在每次匹配之前提取第 5 行。
grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ ln = "matched"; print $1 $1 ~ /^--$/ ln = "" '
它的工作原理基本上是它获取第一行,打印它,然后等待直到它看到^--$
(grep 使用的匹配分隔符),然后重新开始。
【讨论】:
嘿,克里斯,不是 awk 用户,但我想更好地理解这一点。你能详细解释一下 awk 部分吗?我在网上看了一堆教程,其中一些我想不通。 如果我打算用 awk 解决这个问题,那么grep -B5 "pattern" filename | awk 'mod=NR%7; if (mod==1) print $0'
可能更直接。 7 因为 1 个匹配行 + 5 个上下文行 + 1 个分隔符行。输出的第一行将是分隔行,因此感兴趣的行将是每 7 行,从第二行开始。 NR 是 awk 自动为您提供的从零开始的行号。
感谢-B
。我太想念它了。 -An
也意味着“显示 n 行之后”是可能的【参考方案2】:
如果您只想在比赛前获得第 5 行,您可以这样做:
grep -B 5 pattern file | head -1
编辑:
如果你可以有不止一个匹配,你可以试试这个(用你的实际模式交换pattern
):
sed -n '/pattern/!H;x;s/^.*\n\(.*\n.*\n.*\n.*\n.*\)$/\1/;x;/pattern/x;s/^\([^\n]*\).*$/\1/;p' file
我从Sed tutorial,部分:Keeping more than one line in the hold buffer,示例 2 中获取此内容,并对其进行了一些调整。
【讨论】:
这仅适用于第一个匹配项,任何后续匹配项都将被丢弃。 我为它添加了第二种方式 - 这一次它也适用于多个匹配项。【参考方案3】:这是选项-B
-B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. Places a line containing -- between contiguous groups of matches.
【讨论】:
这不符合要求 - 它还显示了所有中间行。【参考方案4】:这种方式对我来说更容易:
grep --no-group-separator -B5 "pattern" file | sed -n 1~5p
这 greps 前 5 行(包括模式),关闭 --- 组分隔符,然后每 5 行打印一次。
【讨论】:
以上是关于如何让“grep”在 grep 行上方显示一行五行?的主要内容,如果未能解决你的问题,请参考以下文章