关于文件:如何使’grep’在grepped线上方显示一行五行?

How can I make 'grep' show a single line five lines above the grepped line?

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


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

1
2
grep -B5"pattern" filename | awk -F '
' 'ln ~ /^$/ { ln ="matched"; print $1 } $1 ~ /^--$/ { ln ="" }'

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


这是选项-B

1
2
3
4
   -B NUM, --before-context=NUM
    Print  NUM  lines  of  leading  context  before  matching lines.
    Places  a  line  containing  --  between  contiguous  groups  of
    matches.


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

1
grep -B 5 pattern file | head -1

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

1
2
3
4
5
6
7
sed -n '/pattern/!{H;x;s/^.*
\(.*
.*
.*
.*
.*\)$/\1/;x};/pattern/{x;s/^\([^
]*\).*$/\1/;p}' file

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


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

1
grep --no-group-separator -B5"pattern" file | sed -n 1~5p

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