IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Comment remplacer des sed par


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut Comment remplacer des sed par
    Bonjour à tous,

    Je me lance dans une modification et même amélioration de code.
    J'ai cru comprendre que le jq était mieux que le sed.
    Pourquoi? Si j'ai bien compris c'est que jq est plus "intelligent" que sed

    Je cherche donc à remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g"| sed '1d'
    par l'équivalent avec jq mais ayant déjà un peu de mal à comprendre le sed j'ai du mal à faire les modifs

    Merci par avance pour vos conseils

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    jq traite le JSON.
    JSON, omme tous les langages à balises, n'a aucune obligation de format : tout peut tenir sur une seule ligne, avoir des lignes vides insérées, des tabulations...
    il faut donc un processeur qui pend uniquement en compte que ces balises.

    plutôt que de devoir traduire cette absconse litanie de seds, on préférerait voir un avant/après accompagnés de quelques explication du pourquoi des modifications opérées.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Voilà avant le traitement des sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"metric":"cpu","tags":{"host":"HP_desk56625"},"aggregateTags":[],"dps":{"1630980703":0.009999999776482582,"1630980763":0.0,"1630981063":0.0,"1630981364":0.0,"1630981664":0.0,"1630981904":0.0,"1630981964":0.009999999776482582,"1630982024":0.0,"1630982325":0.0,"1630982625":0.0,"1630982925":0.0,"1630983225":0.0,"1630983525":0.0,"1630983825":0.0,"1630984125":0.0,"1630984425":0.0,"1630984726":0.0,"1630985026":0.0,"1630985327":0.0,"1630985447":0.0,"1630985507":0.009999999776482582,"1630985567":0.0,"1630985867":0.0,"1630986167":0.0,"1630986467":0.0,"1630986767":0.0,"1630987067":0.0,"1630987367":0.0,"1630987668":0.0,"1630987848":0.0,"1630987908":0.009999999776482582,"1630987968":0.0,"1630988269":0.0,"1630988569":0.0,"1630988869":0.0,"1630989170":0.0,"1630989230":0.009999999776482582,"1630989290":0.0,"1630989530":0.0,"1630989590":0.009999999776482582,"1630989651":0.0,"1630989951":0.0,"1630990251":0.0,"1630990552":0.0,"1630990912":0.0,"1630991212":0.0,"1630991512":0.0,"1630991813":0.0,"1630992053":0.0,"1630992113":0.009999999776482582,"1630992173":0.0,"1630992473":0.0,"1630992774":0.0,"1630992954":0.0,"1630993014":0.009999999776482582,"1630993074":0.0,"1630993375":0.0,"1630993675":0.0,"1630993735":0.0,"1630993795":0.009999999776482582,"1630993855":0.0,"1630994156":0.0,"1630994516":0.0,"1630994757":0.0,"1630994817":0.009999999776482582,"1630994877":0.009999999776482582,"1630994937":0.0,"1630994997":0.009999999776482582,"1630995057":0.0}}]
    Voila le résultat après l'exécution des Sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    1630980703 0.009999999776482582
    1630980763 0.0
    1630981063 0.0
    1630981364 0.0
    1630981664 0.0
    1630981904 0.0
    1630981964 0.009999999776482582
    1630982024 0.0
    1630982325 0.0
    1630982625 0.0
    1630982925 0.0
    1630983225 0.0
    1630983525 0.0
    1630983825 0.0
    1630984125 0.0
    1630984425 0.0
    1630984726 0.0
    1630985026 0.0
    1630985327 0.0
    1630985447 0.0
    1630985507 0.009999999776482582
    1630985567 0.0
    1630985867 0.0
    1630986167 0.0
    1630986467 0.0
    1630986767 0.0
    1630987067 0.0
    1630987367 0.0
    1630987668 0.0
    1630987848 0.0
    1630987908 0.009999999776482582
    1630987968 0.0
    1630988269 0.0
    1630988569 0.0
    1630988869 0.0
    1630989170 0.0
    1630989230 0.009999999776482582
    1630989290 0.0
    1630989530 0.0
    1630989590 0.009999999776482582
    1630989651 0.0
    1630989951 0.0
    1630990251 0.0
    1630990552 0.0
    1630990912 0.0
    1630991212 0.0
    1630991512 0.0
    1630991813 0.0
    1630992053 0.0
    1630992113 0.009999999776482582
    1630992173 0.0
    1630992473 0.0
    1630992774 0.0
    1630992954 0.0
    1630993014 0.009999999776482582
    1630993074 0.0
    1630993375 0.0
    1630993675 0.0
    1630993735 0.0
    1630993795 0.009999999776482582
    1630993855 0.0
    1630994156 0.0
    1630994516 0.0
    1630994757 0.0
    1630994817 0.009999999776482582
    1630994877 0.009999999776482582
    1630994937 0.0
    1630994997 0.009999999776482582
    1630995057 0.0
    Si je comprends bien avec jq je dois utiliser les balises c'est à dire quelque chose comme ça:

    curl | jq -r '{dps}
    Dernière modification par Invité ; 07/09/2021 à 11h53.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    je crois qu'il n'y a pas d'informations ultra-confidentielles, qui permettraient de mettre en péril ton PC, ou ton réseau domestique.

    merci de ne pas faire de capture d'écran à fin qu'on ait pas à recopier manuellement le fichier.
    fais-en un copier/coller, s'il te plaît.

    quant à l'utilisation de jq, je te renvoie à son manuel, qui est très bien fait, et contient des exemples.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 298
    Par défaut
    Bonjour

    Premier jet flemmard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jq '.[].dps' fichier.json
    Deuxième jet plus poussé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jq -r '.[].dps | to_entries[] |"\(.key) \(.value)"' fichier.json

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    j'ai supprimé les captures pour coller le code.

    @flodelarab j'ai regardé sur le net.
    Donc ok pour l'option r qui va enlever les guillemets c'est bien ce que je cherche.
    Après pour le reste j'ai plus de mal:
    .[].dps --> Donc là on ne récupére que les valeurs dps mais pourquoi .[].
    | to_entries[] --> je n'ai pas trouvé la signification de ça
    |"\(.key) \(.value)" --> idem, je n'ai pas trouvé la signification de ça

    en tout cas les commandes jq on l'air d'être bien mieux que des sed successifs
    Dernière modification par Invité ; 07/09/2021 à 12h19.

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 298
    Par défaut
    . Dans le fichier json.
    .metric Dans le fichier json, la valeur de la clé "metric"
    .[] Dans le fichier json, pour toutes les éléments.
    .[].dps Dans le ficher json, pour tous les éléments, la valeur pour la clé dps.

    Naturellement, il renvoie une structure de json comme en entrée. Il faut donc lui demander d'exploiter ce premier résultat pour un autre format. d'où la deuxième commande.

    to_entries, c'est pour utiliser key et value par la suite. Sinon il ne renverrai que la valeur, sans la clé.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je viens de tester en remplaçant les sed initiaux que j'avais dans le code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | json_reformat | jq -r '.[].dps | to_entries[] |"\(.key) \(.value)"' >testJQ.json
    Résultat à l’exécution:jq: command not found

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je viens de faire le test sur un autre pc et ça semble marcher
    En fait ce que tu utilises @flodelarab est générique il faut juste que je comprenne bien les commandes

  10. #10
    Invité
    Invité(e)
    Par défaut
    re bonjour,
    J'ai essayé de poursuivre les modifications mais là je bloque un peu:

    initialement j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | json_reformat| awk -F ":" '{ $1 = "" ; print $0 }'|sed '1,10d'>seuil.json
    ce qui me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
      0.17000000178813934,
      0.11999999731779099,
      0.03999999910593033,
      0.019999999552965164,
      0.009999999776482582,
      0.0,
      0.0,
      0.0,
      0.0,
      0.07999999821186066,
      0.029999999329447746,
      0.009999999776482582,
      0.0,
      0.0,
      0.3499999940395355,
      0.12999999523162842,
      0.05000000074505806,
      0.019999999552965164,
      0.009999999776482582,
      0.0,
      0.0
    Avec plusieurs lignes blanches à la fin du fichier.
    plus loin dans le code il y a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -i 's/,$//' seuil.json
    sed -i '/^$/d' seuil.json
    ce qui donne dans le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
      0.0
      0.0
      0.17000000178813934
      0.11999999731779099
      0.03999999910593033
      0.019999999552965164
      0.009999999776482582
      0.0
      0.0
      0.0
      0.0
      0.07999999821186066
      0.029999999329447746
      0.009999999776482582
      0.0
      0.0
      0.3499999940395355
      0.12999999523162842
      0.05000000074505806
      0.019999999552965164
      0.009999999776482582
      0.0
      0.0
    A ce que je vois c'est que les deux sed enlèvent les , et les lignes blanches à la fin.

    Alors j'ai essayé de tout fusionner grâce à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | json_reformat| jq -r '.[].dps'>seuil.json
    mais je me retrouve avec quelques chode de très différent que ce que je devrais avoir.
    Pourtant .[].dps devrait me donner que la valeur et -r enlever les ""

    Bonne soirée
    Dernière modification par N_BaH ; 07/09/2021 à 21h35.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Autant pour moi j'avais mal compris la précédente explication.
    ça à l'air de marcher avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | json_reformat| jq -r '.[].dps | to_entries[] |"(.value)"'>seuil.json
    ça à aussi l'air de supprimer les lignes vides.
    Ca voudrait dire que je pourrais enlever les deux sed?

    Bonne soirée

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 298
    Par défaut
    Dans un fichier JSON, je ne crois pas que les espaces aient la moindre importance. Les retours à la ligne, non plus. Comme dans un fichier xml. Seul le contenu compte. C'est pour cela que, si tu as un fichier JSON ou XML, il est préférable de le traiter avec un outil adéquat. sed n'est pas génial car il traite ligne à ligne. Un script sed marchera donc bien si le format respecte une forme ligne-à-ligne. Sinon, c'est la catastrophe.

    Supprimer ou ajouter les lignes vides dans un JSON est ridicule car inutile.

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    JSON, comme tous les langages à balises, n'a aucune obligation de format : tout peut tenir sur une seule ligne, avoir des lignes vides insérées, des tabulations...

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/12/2012, 19h14
  2. Combinaisons : comment remplacer des if par une boucle
    Par maccormick dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 06/10/2011, 15h40
  3. Comment remplacer les tabulations par des espaces ?
    Par richarno dans le forum Langage
    Réponses: 7
    Dernier message: 25/10/2007, 14h05
  4. Comment remplacer le clavier par des boutons ?
    Par aliwassem dans le forum Langage
    Réponses: 1
    Dernier message: 14/12/2005, 20h00
  5. Réponses: 5
    Dernier message: 30/05/2005, 17h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo