次の行に特定の一致が含まれていない場合にのみ行を印刷します。

次の行に特定の一致が含まれていない場合にのみ行を印刷します。

完了していない履歴アクティビティのログファイルを取得しようとしています。たとえば、「ID 1234で活動を開始しています...」を記録して成功すると、次の行は「活動1234完了」になります。

その「完了」行が後に出ない「開始...」行を取得しようとしています。

ログファイルの例

Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully

この例では、次のような出力が必要です。

Starting activity for ID 33367

…その後に「完了」の行がないからです。

私はこれを使って多くの成功をgrep収めませんでした。awkこれらのツールのいずれかを使用することは可能だと思いますが、私のgrep能力はawkまだ進歩していません。

私に必要な結果を提供するための迅速で信頼性の高いgrepモードを探しています。awk

ベストアンサー1

代替方法は次のとおりですawk

awk '
  /^Starting/ { I[$5] = $0                  }
  /^ID/       { delete I[$2]                }
  END         { for (key in I) print I[key] }
' infile

出力:

Starting activity for ID 33367

連想配列は、I示されたIDを追跡する。

おすすめ記事