在通过管道传输到 jq 之后,将输出写入文件

如何将经过 jq的管道输出写入 shell 中的文件

例如:

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

没用的,也没用

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

救命啊!

编辑: 这样做 curl api.example.com > call.txt工作正常。所以它必须与管道它到 JQ

86401 次浏览

如果 stdout不是终端,只调用没有过滤器的 jq就会抛出错误

$ 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 '.'(即: pretty-print 输入 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有以下内容: (给你)

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

即: 如果 stdout a TTY 和 stdin 不是 a 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 文件中删除对象“ ProgramSecret”:

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

试试看:

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

我觉得挺好的。