忽略前 N 个匹配项并在 grep 中打印第 (N+1) 个匹配项

忽略前 N 个匹配项并在 grep 中打印第 (N+1) 个匹配项

我如何让 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

确保根据需要填写patternNK

第一个块将跟踪每次发现模式的时间。一旦超过阈值N,第二个块就开始打印每一行。一旦K达到阈值,第二个块将停止打印。

答案3

您可以使用awk

awk 'd && k--&&k>=0; c>=3 && /pattern/{d=1;k=2} /pattern/{c++};' file

首先,每次匹配模式时,值/3/{c++} 都会增加。例如,如果达到 3 的计数,则设置一个标志 ( ) ,并设置其后的行数 ( )。意味着只要 值大于和小于,就打印行。ccdk=2d && k--&&k>=0k02

答案4

grep 'PATTERN' FILENAME | tail -n +M

其中MN+1

相关内容