次の内容を含むログファイルがあります。
2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}
tail -f
このファイルを持って結果をコマンドにパイプしたいのですが、jq
JSON文字列が必要なので、パイプする前にセクションを削除する必要があります。2021-06-15T22:50:11+00:00 DEBUG
jq
jq
ログファイルを追跡し、日付/時刻部分を同時に削除する方法はありますか?
最終的に次のコマンドを使用したいと思います。
tail -f :file | jq
答え1
sed
バッファリングされていない出力を実行できるGNUにアクセスできるとします。
tail -f file | sed -u 's/^[^{]*//' | jq .
このコマンドはtail -f
ファイルで実行され、引き続き新しいデータを送信しますsed
。このsed
コマンドは、行の最初のスペースまですべてを削除し、結果をに送信し{
ますjq
。
-u
sed
GNUには出力をバッファリングしないオプションがあります。このオプションがない場合、結果はバッファリングされ、sed
バッファjq
(4Kb?)がいっぱいになったときにのみデータが送信されます。これらのバッファリングは、ツールの出力が端末自体でない場合の標準的な手順であり、効率のために行われます。この場合、バッファリングをオフにしたい場合があるので-u
。
DEBUG
JSONデータの前に文字列を含む行のみを選択します。
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
ブロックベースの出力バッファリングではなく、ラインベースの出力バッファリングのヒント)