ファイルの末尾を抽出し、日時を削除します

ファイルの末尾を抽出し、日時を削除します

次の内容を含むログ ファイルがあります。

2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}

tail -fこのファイルを使用して結果をコマンドにパイプしたいのですが、 JSON 文字列を想定しているため、パイプする前に一部jqを削除する必要があります。2021-06-15T22:50:11+00:00 DEBUGjqjq

ログ ファイルを末尾まで追跡し、同時に日時部分を削除する方法はありますか?

最終的には以下のコマンドを使いたいと思います。

tail -f :file | jq

答え1

sedバッファなし出力が可能なGNU にアクセスできると仮定します。

tail -f file | sed -u 's/^[^{]*//' | jq .

tail -fこれはファイル上で実行され、新しいデータを継続的に に送信しますsed。コマンドは、行のsed最初のスペースまですべてを削除し、その結果を に送信します。{jq

-uGNU のオプションによりsed、出力がバッファリングされなくなります。このオプションがない場合、sedは結果をバッファリングし、jqバッファ (4 Kb?) がいっぱいになったときにのみデータを に送信します。このようにバッファリングを行うのは、ツールの出力が端末自体ではない場合の標準的な手順であり、効率上の理由で行われます。この場合、バッファリングをオフにしたいことがあるため、 を使用します-u

DEBUGJSON データの前の文字列を含む行のみを選択するには:

tail -f file | sed -u -e '/^[^{]*DEBUG /!d' -e 's///' | jq .

または

tail -f file | sed -u -n 's/^[^{]*DEBUG //p' | jq .

このコマンドは、 で終わるsed文字を含まないテキストで始まらないすべての行を削除します。そのような行が見つかった場合、一致したテキストが削除され、JSON データが残ります。{DEBUG

ここでは、 JSON オブジェクトを開始するDEBUGではなく、文字列に基づいて JSON を抽出することに注意してください。{

パイプラインのバッファリングに関連するもの:

答え2

スペースで区切られた最初の 2 つの列を削除するには:

tail -f file | stdbuf -oL cut -d ' ' -f3- | jq .

( はstdbuf -oL、GNU または FreeBSD システムで見られるように、cutブロックベースではなく行ベースの出力バッファリングを行うトリックです)。

関連情報