web-dev-qa-db-fra.com

Écrire la sortie dans un fichier après avoir été redirigé vers jq

Comment puis-je écrire une sortie canalisée qui est passée par jq dans un fichier dans Shell

Exemple:

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

ne fonctionnera pas. Non plus

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

Aidez-moi!

Edit: Donc, curl api.example.com > call.txt fonctionne parfaitement. Il s’agit donc de la canalisation vers jq

7
supersize

Vous utilisez jq faux ...

Il suffit d'appeler jq pour générer des erreurs si stdout n'est pas un terminal

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

Essayez jq '.' (c'est-à-dire: imprimez en beauté le JSON d'entrée):

$ 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

Notez que le filtre n'est pas vraiment optionnel:

De man jq:

JQ(1)                                                                                JQ(1)

NAME
       jq - Command-line JSON processor

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

Selon la pointe de la branche principale ... votre comportement décrit (et mon comportement observé) n'est pas attendu ...

Les anciennes versions de jq ont les caractéristiques suivantes: ( ici )

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

c'est-à-dire: utilisez un filtre par défaut si stdoutest un TTY et que stdinn'est pas un TTY.

Ce comportement semble être corrigé dans commit 5fe05367 , avec l'extrait de code suivant:

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

Mon incantation:

> cat config.json

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

supposons que vous souhaitiez supprimer l'objet 'ProgramSecrets' du fichier JSON:

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