jq
を通過したパイプ出力をシェルのファイルに書き込むにはどうすればよいですか
例:
curl api.example.com | jq > call.txt
動作しません。どちらも
(curl api.example.com | jq) > call.txt
助けて!
編集:したがって、curl api.example.com > call.txt
を実行しても問題なく動作します。したがって、それを jq にパイピングする必要があります
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 = ".";
つまり、stdout
is TTYでstdin
is not TTYの場合、デフォルトのフィルターを使用します。
この動作は、コミット 5fe05367 で修正されており、次のコードスニペットが含まれています。
if (!program && (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)))
program = ".";
私の呪文:
$ 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" } }