我已经看过一些前后点击线的例子,但是我想忽略中间线.所以,我之前想要五行,但没有别的.可以这样做吗?
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使用的匹配分隔符),然后再次启动.
Cha*_*esB 10
这是选项-B
Run Code Online (Sandbox Code Playgroud)-B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. Places a line containing -- between contiguous groups of matches.
如果您只想在比赛前获得第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并稍微调整一下.
这种方式对我来说更容易:
grep --no-group-separator -B5 "pattern" file | sed -n 1~5p
Run Code Online (Sandbox Code Playgroud)
这会 grep 模式之前的 5 行(包括模式),关闭 --- 组分隔符,然后每 5 行打印一次。