awk -v 変数拡張

awk -v 変数拡張

実行すると、awk '/2017-12-05T12:07:33.941Z/{y=1;next}y' file.json期待どおりに機能し、タイムスタンプ以降のすべての内容が印刷されます。

この構文に従おうとしています。Q&Aしかし、私の構文は正しく拡張されません。

awk -v last_log="$last_log" '/{print last_log}/{y=1;next}y' file.txt

また試してみてください:

awk -v last_log="$last_log" '/$0 ~ last_log/{y=1;next}y' file.txt

たとえば、次の入力が与えられた場合、最後に処理されたすべてのログ(2017-12-05T12:07:33.941Z)を返します。

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12189, "level": 20, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T10:07:33.941Z", "v": 0 }

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12188, "level": 50, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T12:07:33.941Z", "v": 0 }

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12187, "level": 40, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T12:57:33.941Z", "v": 0 }

答え1

2017-12-05T12:07:33.941Zここでは正規表現(.だけでなく、すべての文字と一致する.)を意図したものではないと思います。

正規表現マッチングとは異なり、サブストリングマッチングの場合は次のようになりますindex()

LAST_LOG="$last_log" awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' file.txt

私は変数にバックスラッシュが含まれている場合は変数の内容を破棄することENVIRONを好みます(-v-vQ&Aですでに指摘されているように、)。

失敗の理由について:

/{print last_log}/

として状況{print last_log}正規表現に一致するレコードと一致しますが、有効な正規表現ではありません(or ...{で使用する必要がある正規表現演算子です)。{2}{1,5}

存在する:

/$0 ~ last_log/

今回も正規表現で一致しようとします$0 ~ last_log。これは、以下を含む行を意味します。0 ~ last_log 後ろに行末($)なので絶対一致しません。おそらく次の意味です。

awk -v last_log="$last_log" '$0 ~ last_log {y=1;next};y' file.txt

それは状況$0 ~ last_log正規表現ではなく式です/foo/。レコード全体に対して正規表現を一致させることの/foo/略語です。$0 ~ /foo/foo

あなたはそれを行うことができますが、正規表現の一致ではないため、それ自体は$0 ~ var不可能ですが、ゼロ以外の数字または空ではない数字ではない文字列(あなたのような)が含まれている場合varvary

答え2

awk 間隔の使用

last_logからeofまでは、「、」演算子を介して取得することもできます。

 awk  '$0 ~ last, 0'  last="$last_log" file.txt

示されているように last_log 値を使用します。

 awk "/$last_log/,0" file.txt

たぶん私たちは追加する必要があります| tail -n +1

Sedの使用:

sed  "1,/$last_log/d"  file.txt

関連情報