awkで指定した範囲に特定の文字列が含まれている場合のみ出力したい

特定の処理のログを抽出したく、awkで行っています。
範囲指定はできるのですが、条件を加えると最初の行が取得できません。

ログファイルは下記のような感じです。

start 2024/01/01 00:00:00.123 XXX-XXXXX-XXX RunA [START] ID:AAA NAME:AAA PASS:AAA DESCRIPTION:AAA 2024/01/01 00:00:10.123 XXX-XXXXX-XXX RunB [END] end start 2024/01/10 00:00:00.123 XXX-XXXXX-XXX RunA [START] ID:BBB NAME:BBB PASS:BBB DESCRIPTION:BBB 2024/01/10 00:00:10.123 XXX-XXXXX-XXX RunB [END] end start 2024/01/15 00:00:00.123 XXX-XXXXX-XXX RunA [START] ID:ABC NAME:ABC PASS:ABC DESCRIPTION:ABC 2024/01/15 00:00:10.123 XXX-XXXXX-XXX RunB [END] end start 2024/01/15 00:00:20.123 XXX-XXXXX-XXX RunA [START] ID:CCC NAME:CCC PASS:CCC DESCRIPTION:CCC 2024/01/15 00:00:30.123 XXX-XXXXX-XXX RunB [END] end

これに対し下記awkコマンド①を実行します。

awk '/RunA \[START\]/,/RunB \[END\]/' logfile

出力は下記で、これは期待通りです。

2024/01/01 00:00:00.123 XXX-XXXXX-XXX RunA [START] ID:AAA NAME:AAA PASS:AAA DESCRIPTION:AAA 2024/01/01 00:00:10.123 XXX-XXXXX-XXX RunB [END] 2024/01/10 00:00:00.123 XXX-XXXXX-XXX RunA [START] ID:BBB NAME:BBB PASS:BBB DESCRIPTION:BBB 2024/01/10 00:00:10.123 XXX-XXXXX-XXX RunB [END] 2024/01/15 00:00:00.123 XXX-XXXXX-XXX RunA [START] ID:ABC NAME:ABC PASS:ABC DESCRIPTION:ABC 2024/01/15 00:00:10.123 XXX-XXXXX-XXX RunB [END] 2024/01/15 00:00:20.123 XXX-XXXXX-XXX RunA [START] ID:CCC NAME:CCC PASS:CCC DESCRIPTION:CCC 2024/01/15 00:00:30.123 XXX-XXXXX-XXX RunB [END]

しかし、下記awkコマンド②の場合、期待通りにはなりません。

awk '/RunA \[START\]/,/RunB \[END\]/ {if ($0 ~ /ID:BBB/) {found=1} if (found) print} /RunB \[END\]/ {found=0}' logfile

出力は下記の通りで、RunA [START]を含む行が出力されていませんでした。

ID:BBB NAME:BBB PASS:BBB DESCRIPTION:BBB 2024/01/10 00:00:10.123 XXX-XXXXX-XXX RunB [END]

なぜ②ではRunA [START]の行が出力されなくなったのでしょうか。

コメントを投稿

0 コメント