私は次の2つのバリエーションを試しています。
cat /var/log/zwave.log | xargs -n1 jq '.'
&:
</var/log/zwave.log xargs -n1 jq '.'
両方のコマンドが実行されているように見えますが、その行をファイルの場所として開こうとします。これは私がリストした2番目のコマンドには意味がありますが、パイプを使用する最初のコマンドでは、各行がパイプで接続されているかのzwave.log
ように動作する必要はありませんかjq '.'
?
私が作業しているが生成を制御できないロギングシステムは、ログファイルの各行にjsonオブジェクトを生成します。
{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12189.20, "level": 20, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-04T00:20:30.953Z", "v": 0 }
ただし、ロガーは時々失敗し、このような結果を生成しますUnable to start service: [TimeoutError: operation timed out]
。
そのため、jq
ファイルにのみ使用できません。
答え1
xargsを使用しないでください。
jq '.' /var/log/zwave.log
json行だけをフィルタリングする必要がある場合は、前にgrepを使用できます。
grep -E "^{" test.txt | jq '.'
Xargs は、入力の各単語を与えられたコマンドに引数として追加するために使用され、デフォルトでは-n 1
以下を実行するのと同じです。
jq '.' "$word1"
jq '.' "$word2"
jq '.' "$word3"
これがあなたが見るものです。ファイルにコマンドに渡す他のファイルまたは引数のリストが含まれている場合は、xargsを使用する必要があります。
xargs
¹はスペースで区切られた単語(ロケールと実装によっては少なくともスペース、タブ、改行、YMMV xargs
)を表しますxargs
が、最新のシェルまたはJSONファイル形式と同じ方法ではありませんが、一部の形式の引用も理解しています。
答え2
ファイルが実際に1行ずつjsonの場合、jqではマイナーなことです。
jqにはこれに対するサポートが組み込まれています。-s
cat my_file | grep -E "^{" test.txt | jq -sre '.'
これはすべてのjsonをjqの1つの配列にリンクするので、これを念頭に置く必要がありますが、実行できるアイデアを提供します。
cat my_file | grep -E "^{" test.txt |jq -sre '.[].name'
これはあなたのすべての名前をダンプします