2015-10-20 58 views
87

我似乎無法讓jq在shell管道中表現「正常」。例如:如何在shell管道中使用`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故意想逃出來,如果它決定了它沒有被從終端方式運行?如何防止這種行爲,以便我可以在管道中使用jq


* (我知道這個例子中含有useless use of cat;它是僅用於說明目的)

回答

158

您需要提供一個過濾器作爲參數。要通過未修改其他通過JSON比漂亮的印刷jq默認提供,使用身份過濾.

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數據提供給其他shell命令,例如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' 
+4

這很酷,但不確定它與這個問題有什麼關係? – mgalgs

+1

@mgalgs我發現自己希望在shell管道的開始處生成/使用'jq',而不是在中間/結尾處過濾掉某些數據。'curl'的例子是一個基本的例子,但我發現自己經常用手將JSON數據輸入到'curl'並試圖引用正確,所以我認爲它可能對其他人有用。 – mkobit