grep で最初の N 個の一致を無視し、(N+1) 番目の一致を出力します。

grep で最初の N 個の一致を無視し、(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

必要に応じて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++} 増分しますccたとえば、カウントが 3 に達した場合は、フラグ ( d) を設定し、その後の行数 ( k=2) を設定します。は、 value が より大きくより小さい場合は、行を印刷するd && k--&&k>=0ことを意味します。k02

答え4

grep 'PATTERN' FILENAME | tail -n +M

MN+1はどこにあるか

関連情報