如何让'grep'在grepped线上方显示一行五行?

mik*_*628 31 grep file

我已经看过一些前后点击线的例子,但是我想忽略中间线.所以,我之前想要五行,但没有别的.可以这样做吗?

Chr*_*rle 32

好的,我认为这会做你想要的.它将寻找一个模式,并在每场比赛前提取第5行.

grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }'
Run Code Online (Sandbox Code Playgroud)

基本上它是如何工作的,它需要第一行,打印它,然后等到它看到^--$(grep使用的匹配分隔符),然后再次启动.

  • 嘿克里斯,不是一个awk用户,但我想更好地理解这一点.你能详细解释一下awk部分.我在网上看了一堆教程,其中一些我无法弄清楚. (2认同)

Cha*_*esB 10

这是选项-B

   -B NUM, --before-context=NUM
    Print  NUM  lines  of  leading  context  before  matching lines.
    Places  a  line  containing  --  between  contiguous  groups  of
    matches.
Run Code Online (Sandbox Code Playgroud)

  • 但这并不符合要求 - 它也显示了所有中间线. (6认同)

bmk*_*bmk 9

如果您只想在比赛前获得第5行,您可以这样做:

grep -B 5 pattern file | head -1
Run Code Online (Sandbox Code Playgroud)

编辑:
如果您可以有多个匹配,您可以尝试这个(pattern与您的实际模式交换):

sed -n '/pattern/!{H;x;s/^.*\n\(.*\n.*\n.*\n.*\n.*\)$/\1/;x};/pattern/{x;s/^\([^\n]*\).*$/\1/;p}' file
Run Code Online (Sandbox Code Playgroud)

我从Sed教程中获取了这一部分:在保持缓冲区中保留多行,示例2并稍微调整一下.


har*_*guy 6

这种方式对我来说更容易:

grep --no-group-separator -B5 "pattern" file | sed -n 1~5p
Run Code Online (Sandbox Code Playgroud)

这会 grep 模式之前的 5 行(包括模式),关闭 --- 组分隔符,然后每 5 行打印一次。