
実行すると、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
-v
Q&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
不可能ですが、ゼロ以外の数字または空ではない数字ではない文字列(あなたのような)が含まれている場合var
var
y
答え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