sed\awk を使用してファイル内の特定の行を検索し、その後に異なるパターンに一致するすべての後続の行を一致させるにはどうすればよいですか?

sed\awk を使用してファイル内の特定の行を検索し、その後に異なるパターンに一致するすべての後続の行を一致させるにはどうすればよいですか?

同様のトピックを見つけましたが、それを自分の用途にどのように実装すればよいかわかりませんでした。

一致するターゲット行の後の複数の行を取得します

問題は次のとおりです:

自分のプロジェクトに実装しようとしているのですが、うまく動作しないようです。Linux を使用しているのですが、誰か説明してもらえませんか?

基本的に私がやろうとしているのは、ログ バンドルを調べて、特定の行とそのスタックの詳細をキャプチャすることです。次に例を示します。

2020-01-20T05:58:19.119Z verbose vpxa[6E21B70] [Originator@6876 sub=PropertyProvider opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [CommitChangesAndNotify] Updating cached values
2020-01-20T05:58:19.119Z info vpxa[6E21B70] [Originator@6876 sub=Default opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [VpxLRO] -- ERROR task-107599 -- **vm-1178** -- vim.VirtualMachine.reconfigure: vmodl.fault.InvalidArgument:
--> Result:
--> (vmodl.fault.InvalidArgument) {
-->    faultCause = (vmodl.MethodFault) null,
-->    faultMessage = (vmodl.LocalizableMessage) [
-->       (vmodl.LocalizableMessage) {
-->          key = "msg.disk.extendFailure",
-->          arg = (vmodl.KeyAnyValue) [
-->             (vmodl.KeyAnyValue) {

パターンが変化するまで、「vm-1178」を含むすべての行と、「-->」で始まる後続のすべての行をキャプチャし、次にこれが発生するまで vm-1178 の検索を開始します。

意味が通じていれば幸いです。ありがとうございます!

答え1

これを試して、

awk '!/^-->/{p=0} /vm-1178/{p=1} p'
  • !/^-->/{p=0}p:行が で始まらない場合は、var (print と同様) を 0 に設定します-->
  • /vm-1178/{p=1}:p行が一致するたびに var = 1を設定します/vm-1178/
  • p: が真であるときは常にその行を出力しますp(ここでは1)

答え2

awkその目的には以下を使用できます:

awk 'index($0,"vm-1178")>0 {in_pat=1; print; next} \
in_pat == 1 && $0 ~ /^-->/ {print; next} \
{in_pat=0}' logfile.txt

これには 3 つのルールが含まれます。

  • 最初のルールは、パターンを含む行を探してそれを出力し、内部フラグをin_pat1 に設定します。
  • 2 番目のルールは、 で始まる後続の行もすべて-->印刷されることを規定しています。
  • 3番目のルールは最初の行でフラグをリセットするために使用されますないパターンが含まれているか、 で始まっていない-->ため、パターンが再び見つかるまでは何も印刷されません。

最初のルールでは、indexRegExp 一致ではなく関数が使用されていることに注意してください。これにより、正規表現で特別な意味を持つ文字を含むパターンも検索できるようになります。

答え3

perl を使用すると、次のように動作します:

 perl -ne ' { $t=0 if ( !/^-->/ ); $t=1 if(/vm-1178/); print if($t); }' <filename>

関連情報