ファイル内の2つのパターンの間に最後に現れる行を取得するには?

ファイル内の2つのパターンの間に最後に現れる行を取得するには?

プロセスの出力を報告するログファイルがあり、両方のパターンの最後の発生からすべての行を抽出したいと思います。

これらのパターンは、次の行に従います。

Summary process started at <datestring>

そして

Summary process finished at <datestring> with return code <num>

他の多くの情報とともに、ファイル全体にこれらのパターンの複数のインスタンスがあります。最後の項目だけを印刷したいです。

以下が利用可能であることを知っています。

sed -n '/StartPattern/,/EndPattern/p' FileName

パターン間の線を把握しましたが、それを取得する方法がわかりません。最後はい。

sedまたはawk解決策が出るでしょう。

編集する:StartPatternsmultiple EndPattern。​​EndPatternStartPattern

  • StartPattern複数の欠落sがある場合は、最後の行から最後の行だけがEndPattern必要です。StartPatternEndPattern
  • 来ないのはStartPattern来てほしいし、その後は早期到着注意があります。EOFEndPatternEOFEOF

ベストアンサー1

いつでも次のことができます。

tac < fileName | sed  '/EndPattern/,$!d;/StartPattern/q' | tac

システムにGNUがない場合はtacそれを使用することもできますtail -r

次のようにすることもできます。

awk '
  inside {
    text = text $0 RS
    if (/EndPattern/) inside=0
    next
  }
  /StartPattern/ {
    inside = 1
    text = $0 RS
  }
  END {printf "%s", text}' < filename

ただし、これはファイル全体を読み取ることを意味します。

StartPatternaと次の間に何かがある場合、最後が終わらない場合、またはaと一致する行がある場合は、他の結果が表示されることがあります。StartPatternEndPatternStartPatternEndPatternStartPatternEndPattern

awk '
  /StartPattern/ {
    inside = 1
    text = ""
  }
  inside {text = text $0 RS}
  /EndPattern/ {inside = 0} 
  END {printf "%s", text}' < filename

tac+sed+tac(閉じていない末尾のケースを除いて)その方法と同様に機能しますStartPattern

最後の項目が編集者が望むものに最も近いようです。警告を追加するには:

awk '
  /StartPattern/ {
    inside = 1
    text = ""
  }
  inside {text = text $0 RS}
  /EndPattern/ {inside = 0} 
  END {
    printf "%s", text
    if (inside)
      print "Warning: EOF reached without seeing the end pattern" > "/dev/stderr"
  }' < filename

ファイル全体を読み取らないようにするには:

tac < filename | awk '
  /StartPattern/ {
    printf "%s", $0 RS text
    if (!inside)
      print "Warning: EOF reached without seeing the end pattern" > "/dev/stderr"
    exit
  }
  /EndPattern/ {inside = 1; text = ""}
  {text = $0 RS text}'

移植性注:)/dev/stderrのための特別なファイルを含むシステム、またはawkそれをエミュレートする実装(たとえばgawkmawkbusybox)が必要ですawk(上記のLinuxの問題を解決しました)。

print ... > "/dev/stderr"他のシステムではに置き換えることができますprint ... | "cat>&2"

おすすめ記事