%20%E5%80%8B%E5%8C%B9%E9%85%8D%E9%A0%85.png)
如何讓 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++}
都會增加值。例如,c
如果計數達到 3,則設定一個標誌 ( ),並設定其後的行數 ( )。表示只要 值大於或小於,就列印行。c
d
k=2
d && k--&&k>=0
k
0
2
答案4
grep 'PATTERN' FILENAME | tail -n +M
其中M
N+1