web-dev-qa-db-ja.com

jqにパイプされた後に出力をファイルに書き込む

jqを通過したパイプ出力をシェルのファイルに書き込むにはどうすればよいですか

例:

curl api.example.com | jq > call.txt

動作しません。どちらも

(curl api.example.com | jq) > call.txt

助けて!

編集:したがって、curl api.example.com > call.txtを実行しても問題なく動作します。したがって、それを jq にパイピングする必要があります

17
supersize

jqが端末でない場合、フィルターなしでstdoutを呼び出すだけでエラーがスローされます

$ curl https://jsonplaceholder.typicode.com/posts/1 | jq > test.txt
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]

        jq is a tool for processing JSON inputs, applying the
        given filter to its JSON text inputs and producing the
[...]

jq '.'(つまり、入力JSONをきれいに出力)を試してください:

$ curl https://jsonplaceholder.typicode.com/posts/1 | jq '.' > test.txt
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   292  100   292    0     0   1698      0 --:--:-- --:--:-- --:--:--  1707

フィルターは実際にはオプションではないことに注意してください。

man jqから:

JQ(1)                                                                                JQ(1)

NAME
       jq - Command-line JSON processor

SYNOPSIS
       jq [options...] filter [files...]

マスターブランチの先端によると...あなたの記述された(そして私の観察された)動作は予期されていません...

jqの古いバージョンには以下があります:( here

if (!program && isatty(STDOUT_FILENO) && !isatty(STDIN_FILENO))
  program = ".";

つまり、stdoutis TTYでstdinis not TTYの場合、デフォルトのフィルターを使用します。

この動作は、コミット 5fe05367 で修正されており、次のコードスニペットが含まれています。

if (!program && (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)))
  program = ".";
22
Attie

私の呪文:

$ cat config.json

{
    "ProgramSettings":
    {
        "version": "1.0"
    },
    "ProgramSecrets":
    {
        "AWS_ACCESS_KEY_ID": "",
        "AWS_SECRET_ACCESS_KEY": ""
    }
}

jSONファイルからオブジェクト「ProgramSecrets」を削除するとします。

$ echo $(cat config.json | jq 'del(.ProgramSecrest)') > config.json
$ cat config.json
{ "ProgramSettings": { "version": "1.0" } }
3
Jarikus