シェルパイプラインで「jq」を使用する方法


195

jqシェルパイプラインで「正常に」動作するようには見えません。例えば:

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

その結果、jqヘルプテキスト*が出力されます。jqの出力をファイルにリダイレクトしようとすると、同じことが起こります。

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

されjq、それがttyから実行されていないと判断した場合、意図的に救済しますか?jqパイプラインで使用できるように、この動作を防ぐにはどうすればよいですか?


* (この例には猫の役に立たない使い方が含まれていることに気づきました。これは説明のみを目的としています)

回答:


323

引数としてフィルターを指定する必要があります。jqデフォルトでプリティプリンティングが提供する以外の変更されていない状態でJSONを渡すには、IDフィルターを使用します.

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

23
OPが持っていたので、私はそれを残しました。私はそれjqがパイプからの読み取りと別のパイプへの書き込みの両方であることを示すための単なるプレースホルダーだと思います。の出力を単に表示したい場合はjq、それcat自体は不要です。
chepner 2015年

3
(1)jqバージョン1.5が拡張され、。このような場合は不要です。(2)「。」を引用する必要はありません。
ピーク

6
@peakパイプラインには必要ないかもしれませんが、私は1.5を持っており、「。」を提供する必要がありました。出力をファイルにリダイレクトします。
MHarris

2
.の習慣は、最初にJSONがどのように見えるかを確認してから、戻ってフィルターに追加することです。
chepner

6
@WalterTrossはい、そして私はそれを引用する理由を18か月前にコメントで説明しました。
chepner 2017

15

私自身も頻繁に実行していることがわかった1つの使用例は、「JSONデータを作成して他のシェルコマンドに提供する方法などcurl」です。私がこれを行う方法は、--null-input/-nオプションを使用することです:

入力をまったく読み取らないでください。代わりに、フィルターはnull入力として使用して一度実行されます。これはjq、単純な計算機として使用する場合、またはJSONデータを最初から作成する場合に役立ちます。

そしてそれを渡す例curl

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

9
それはすばらしいですが、それがこの質問にどのように関連しているかはわかりませんか?
mgalgs 2017年

2
@mgalgs jq一部のデータをフィルタリングするために、中間/最後ではなく、シェルパイプラインの最初で生成/使用したいと思っていました。このcurl例は基本的なものですが、私は頻繁にJSONデータを手で入力しcurlて正しい引用を試みようとしているので、他の人にも役立つかもしれないと思いました。
mkobit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.