%20%E7%95%AA%E7%9B%AE%E3%81%AE%E4%B8%80%E8%87%B4%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.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
最初のブロックは、パターンが見つかるたびにそれを記録します。それがしきい値を超えると、2 番目のブロックが各行の印刷を開始します。しきい値に達するN
と、2 番目のブロックは印刷を停止します。K
答え3
使用できますawk
awk 'd && k--&&k>=0; c>=3 && /pattern/{d=1;k=2} /pattern/{c++};' file
まず、パターンに一致するたびに value を/3/{c++}
増分しますc
。c
たとえば、カウントが 3 に達した場合は、フラグ ( d
) を設定し、その後の行数 ( k=2
) を設定します。は、 value が より大きくより小さい場合は、行を印刷するd && k--&&k>=0
ことを意味します。k
0
2
答え4
grep 'PATTERN' FILENAME | tail -n +M
M
N+1はどこにあるか