我如何让 grep 忽略文件中的前 N 个匹配项,然后打印第 (N+1) 个匹配项及其后的所有 k 行,然后退出。
答案1
只需将结果传输至tail(1)
。例如,如果N
为 10,则使用tail +11
跳过前 10 个匹配项:
grep pattern file | tail +11
答案2
替代解决方案awk
:
awk '/pattern/ { found++ } found > N && printed <= K { print; printed++ }' file
更具可读性:
awk '
# Initialize to zero for clarity
BEGIN {
found = 0
printed = 0
}
# Check for a pattern match
/pattern/ {
found++
# Found one match
}
# Check if it's the right time to print
found > N && printed <= K {
print
printed++
# Printed once
}' file
确保根据需要填写pattern
、N
和K
。
第一个块将跟踪每次发现模式的时间。一旦超过阈值N
,第二个块就开始打印每一行。一旦K
达到阈值,第二个块将停止打印。
答案3
您可以使用awk
awk 'd && k--&&k>=0; c>=3 && /pattern/{d=1;k=2} /pattern/{c++};' file
首先,每次匹配模式时,值/3/{c++}
都会增加。例如,如果达到 3 的计数,则设置一个标志 ( ) ,并设置其后的行数 ( )。意味着只要 值大于和小于,就打印行。c
c
d
k=2
d && k--&&k>=0
k
0
2
答案4
grep 'PATTERN' FILENAME | tail -n +M
其中M
N+1