it-swarm.com.de

Schreibe die Ausgabe in eine Datei, nachdem sie an jq weitergeleitet wurde

Wie schreibe ich eine gepipste Ausgabe, die jq in eine Datei in Shell lief?

Beispiel:

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

funktioniert nicht Auch nicht

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

Hilfe!

Edit: Also funktioniert curl api.example.com > call.txt gut. Es hat also mit dem Piping zu jq zu tun.

7
supersize

Sie verwenden jq falsch ...

Wenn Sie jq aufrufen, werden Fehler ausgegeben, wenn stdout kein Terminal ist

$ 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
[...]

Versuchen Sie es mit jq '.' (d. H.: Die Eingabe-JSON wird hübsch gedruckt):

$ 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

Beachten Sie, dass der Filter nicht wirklich optional ist:

Von man jq:

JQ(1)                                                                                JQ(1)

NAME
       jq - Command-line JSON processor

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

Entsprechend dem Tipp des Master-Zweigs ... wird Ihr beschriebenes (und mein beobachtetes) Verhalten nicht erwartet ...

Ältere Versionen von jq haben folgendes: ( hier )

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

das heißt: Verwenden Sie einen Standardfilter, wenn stdout ein TTY ist und stdinkein ein TTY ist.

Dieses Verhalten scheint in commit 5fe05367 mit dem folgenden Code-Snippet behoben zu werden:

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

Meine Beschwörung

> cat config.json

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

angenommen, Sie möchten das Objekt 'ProgramSecrets' aus der JSON-Datei entfernen:

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