
次の内容を含むログ ファイルがあります。
2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}
tail -f
このファイルを使用して結果をコマンドにパイプしたいのですが、 JSON 文字列を想定しているため、パイプする前に一部jq
を削除する必要があります。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
GNU のオプションによりsed
、出力がバッファリングされなくなります。このオプションがない場合、sed
は結果をバッファリングし、jq
バッファ (4 Kb?) がいっぱいになったときにのみデータを に送信します。このようにバッファリングを行うのは、ツールの出力が端末自体ではない場合の標準的な手順であり、効率上の理由で行われます。この場合、バッファリングをオフにしたいことがあるため、 を使用します-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
ブロックベースではなく行ベースの出力バッファリングを行うトリックです)。