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

sup*_*ize 19 shell io-redirection

如何编写通过jqshell发送到文件的管道输出

例:

curl api.example.com | jq > call.txt
Run Code Online (Sandbox Code Playgroud)

不行.也没有

(curl api.example.com | jq) > call.txt
Run Code Online (Sandbox Code Playgroud)

救命!

编辑:所以做得curl api.example.com > call.txt很好.所以它与管道到jq有关

Att*_*tie 28

你使用jq错了......

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
[...]
Run Code Online (Sandbox Code Playgroud)

尝试man 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
Run Code Online (Sandbox Code Playgroud)

请注意,过滤器不是真正可选的:

来自jq:

JQ(1)                                                                                JQ(1)

NAME
       jq - Command-line JSON processor

SYNOPSIS
       jq [options...] filter [files...]
Run Code Online (Sandbox Code Playgroud)

根据主分支的提示......你所描述的(以及我观察到的)行为是不可预期的......

旧版本stdout具有以下内容:( 此处)

if (!program && isatty(STDOUT_FILENO) && !isatty(STDIN_FILENO))
  program = ".";
Run Code Online (Sandbox Code Playgroud)

即:如果stdin TTY,则使用默认过滤器,而jq 不是 TTY.

此行为似乎在提交5fe05367中得到纠正,使用以下代码片段:

if (!program && (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)))
  program = ".";
Run Code Online (Sandbox Code Playgroud)

  • 你必须指定过滤器,通过将过滤器作为"`.`"来传递所有内容 - 例如:`curl api.example.com | jq.> call.txt` (3认同)
  • `.` 是最基本的“_do nothing_”过滤器...... `jq` 显然有一些逻辑假设,如果没有给定过滤器,_并且_输出是 PTY,然后使用过滤器 `.`......如果输出不是 PTY(例如:它是一个文件),则不进行此假设。 (3认同)

Jar*_*kus 16

我的咒语:

$ cat config.json

{
    "ProgramSettings":
    {
        "version": "1.0"
    },
    "ProgramSecrets":
    {
        "AWS_ACCESS_KEY_ID": "",
        "AWS_SECRET_ACCESS_KEY": ""
    }
}
Run Code Online (Sandbox Code Playgroud)

假设您想从 JSON 文件中删除对象“ProgramSecrets”:

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

  • 虽然很有趣,但这并没有为上述问题提供任何答案。 (4认同)
  • 这也可能会在 `config.json` 上打上标记......即:`&gt; config.json` 会在 `cat config.json` 有机会读取它之前截断它。 (4认同)
  • @simesy - 你可能想看看“海绵”! (4认同)
  • 我已经尝试过这样并且有效。`cat 清单.json | jq ".version |= \"${VERSION}\"" --indent 4 | tee清单.json` (3认同)

Joy*_*ama 5

你试一试:

curl api.example.com | jq '.' > call.txt
Run Code Online (Sandbox Code Playgroud)

这对我来说可以。