ファイル追跡と日付/時刻の削除

ファイル追跡と日付/時刻の削除

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

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

tail -fこのファイルを持って結果をコマンドにパイプしたいのですが、jqJSON文字列が必要なので、パイプする前にセクションを削除する必要があります。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

-usedGNUには出力をバッファリングしないオプションがあります。このオプションがない場合、結果はバッファリングされ、sedバッファjq(4Kb?)がいっぱいになったときにのみデータが送信されます。これらのバッファリングは、ツールの出力が端末自体でない場合の標準的な手順であり、効率のために行われます。この場合、バッファリングをオフにしたい場合があるので-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 -oLGNUまたはFreeBSDシステムで見られるcutブロックベースの出力バッファリングではなく、ラインベースの出力バッファリングのヒント)

関連情報