管道传输到jq后将输出写入文件

时间:2018-02-24 15:12:50

标签: shell io-redirection

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

示例:

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

不起作用。

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

帮助!

编辑:这样做curl api.example.com > call.txt就可以了。所以它与管道jq

有关

2 个答案:

答案 0 :(得分:14)

如果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 是TTY且stdin 不是 TTY,请使用默认过滤器。

此行为似乎在提交5fe05367中得到纠正,并带有以下代码段:

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

答案 1 :(得分:3)

我的咒语:

$ 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" } }