如何让“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 行上方显示一行五行?的主要内容,如果未能解决你的问题,请参考以下文章

grep显示行内容

grep 文本文件中所有包含“xxx”的行和上一行

linux基础之grep

grep命令

grep命令

grep命令