2015-10-20 5 views
87

シェルパイプラインでjqが "正常に"動作するように見えません。たとえば:jqシェルパイプラインで `jq`を使うには?

$ curl -s https://api.github.com/users/octocat/repos | jq | cat 

結果は単に*そのヘルプテキストをプリントアウトします。それはそれがttyから実行されていないと判断した場合

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json 

jqは故意に救済されています:私は、ファイルにjqの出力をリダイレクトしようとした場合、同じことが起こりますか?パイプラインでjqを使用できるように、この動作を回避するにはどうすればよいですか?


* (私は、この例では、useless use of catが含まれて実現、それは、例示のみの目的のためです)

答えて

158

あなたは、引数としてフィルタを指定する必要があります。きれいな印刷jqがデフォルトで提供するよりも、変更されていない他の通過JSONを渡すには、アイデンティティフィルタ.を使用します。私は自分自身だけでなく、頻繁にやって発見した

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat 
+0

なぜ "猫" へのパイプ?本当に必要ですか? –

+15

私はOPにそれがあったのでそれを残しました。 'jq'がパイプから読み込んでいて、別のパイプに書き込んでいることを示すためのプレースホルダです。単に 'jq'の出力を見ることが望まれる場合、' cat'自体は不要です。 – chepner

+3

(1)jqバージョン1.5が拡張されました。このような場合は不要です。 (2) "。"を引用する必要はありません。 – peak

3

つのユースケースは、どのように私はJSONデータを構築するか」です例えばcurlのような他のシェルコマンドへの供給? "私がこれを行う方法は--null-input/-nオプションを使用することです:

入力を一切読んではいけません!代わりに、フィルタは入力としてnullを使用して1回実行されます。これは、単純な電卓としてjqを使用する場合や、JSONデータをゼロから構築する場合に便利です。

そして curlにそれを渡す例:

jq -n '{key: "value"}' | curl -d @- \ 
    --url 'https://some.url.com' \ 
    -H 'Content-Type: application/json' \ 
    -H 'Accept: application/json' 
+4

それはクールですが、この質問にどのように関係があるのか​​よく分かりません。 – mgalgs

+1

@mgalgs私は、いくつかのデータをフィルタリングするために中間/端ではなく、シェルパイプラインの開始時に 'jq'を生成/使用したいと思っていました。'curl'の例は基本的な例ですが、JSONデータで' curl'を頻繁に入力して引用符を付けようとしていることがよくあるので、他の人にも役立つと思いました。 – mkobit

関連する問題