Aller au contenu

[Résolu] Parser un fichier en SHELL bash


snowludo

Messages recommandés

Parser est un bien grand mot... je souhaite simplement colorer un fichier pour une lecture plus facile.

Je m'explique, en gros j'ai un fichier test.xml de cette forme

<tag1>fraise</tag1><tag2>banane</tag2>
<tag3>pomme</tag3>
<tag4>kiwi</tag4>

mais en beaucoup plus compliqué et illisible.

Ce que je souhaite c'est un script capable de lire mon XML ligne par ligne et de retransmettre directement à l'écran les lignes avec la valeur colorée en rouge.

------------------

<tag1>fraise</tag1><tag2>banane</tag2>

<tag3>pomme</tag3>

<tag4>kiwi</tag4>

------------------

Ce que j'ai déja de mon coté (mais qui ne fonctionne pas)

./colorier.sh test.xml

#!/bin/sh

couleur='>^33[1;32m'
fincouleur='^33[0m<'

lefichier=`cat $1`
for fichier in $lefichier;
do
  echo `cat $fichier | sed s/^>/${couleur}/g | sed s/^</${fincouleur}/g`
done;
exit 0;

Merci à ceux qui pourront m'aider!

ps: le forum a bouffer mes anti slash pour le code couleur mais ils sont présents, je les remplacer par un ^ pour la compréhension.

Lien vers le commentaire
Partager sur d’autres sites

Sinon ce ne serait pas plus simple de faire un fichier de coloration syntaxique pour vim ou emacs ?

Vu que c'est un xml, vim lit et highlight deja le XML :)

Mais sinon, je ne virerais pas le echo, mais le cat !

le cat tente de lire dans un fichier, or tu lui passe une ligne de xml en parametre :francais:

donc il faut faire echo $fichier | sed blabla (et virer les `` )

Lien vers le commentaire
Partager sur d’autres sites

Pour etre plus précis, il ne s'agit pas d'un .xml à proprement dit, c'est un dump HTTP d'une 100ène de Mo (pour le moment) contenant du format XML.

Ce qui m'intéresse, c'est d'avoir les 100 dernières lignes.

Pour le moment je me contentais de:

cat mon_log | tail -100

Mais pour un confort visuel je voulais le colorer tout en conservant l'indentation des balises (toujours pour le confort visuel)

Je n'ai pas vims et je ne peux installer d'appli tierces car il s'agit d'une machine en production mais j'aimerais vraiment réussir ce petit script car je visualise très souvent ce fichier et repérer toutes les valeurs nécessaires dans la masse est plutot fatiguant!

Le fichier n'étant surtout pas amené à être modifié à la main, la sortie dans un éditeur ne m'intéresse pas dans la mesure du possible.

Les diverses tentatives faites par moi même ou d'après vos conseils ramènent à un:

sed: command garbled: s/</^33[0m</g (je remplace l'antislash par un ^ pour ce forum)

La machine est sous SunOS 5.8

Merci de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

As tu regardé les réponses ?

Il n'y a pas que vim...

Bien sûr que je lis vos réponses :reflechis:

Je précise alors que je n'ai pas geany, et que vi et emacs ne semblent pas par défaut highlight le XML (mon fichier n'a pas d'extension et n'en aura jamais), si c'est un module à ajouter à ces éditeurs je ne peux pas comme je le disais, il faut que ce soit des commandes par défauts ou un simple .sh qui récupère les 100 dernières lignes et insère les couleurs.

Je suis sûr que j'ai un problème de synthaxe simplement et que la piste est bonne, mais toutes mes tentatives se soldent par le fameux "command garbled" ou par l'affichage brut du code couleur et non la coloration du texte :(

Lien vers le commentaire
Partager sur d’autres sites

#!/bin/sh

couleur=">\\33[1;32m"
fincouleur="\\33[0m<"

while read ligne; do
       L=$(echo $ligne  | sed 's/>/'"$fincouleur"'/g' | sed 's/</'"$couleur"'/g')
       echo -e $L
done < $1
exit 0;

on est pas loin la. Deja faut passer par un echo -e pour executer tes codes couleurs. Ensuite tes sed il modifie la sortie de echo donc trop tard pour colorer, donc on passe par une variable. les 3 \ devant le code couleur c'est pas mal aussi vu que sed va en virer 1

Lien vers le commentaire
Partager sur d’autres sites

#!/bin/sh

couleur=">\\33[1;32m"
fincouleur="\\33[0m<"

while read ligne; do
       L=$(echo $ligne  | sed 's/>/'"$fincouleur"'/g' | sed 's/</'"$couleur"'/g')
       echo -e $L
done < $1
exit 0;

on est pas loin la. Deja faut passer par un echo -e pour executer tes codes couleurs. Ensuite tes sed il modifie la sortie de echo donc trop tard pour colorer, donc on passe par une variable. les 3 \ devant le code couleur c'est pas mal aussi vu que sed va en virer 1

bash-2.03# inpact.sh dumpHTTP
./inpact.sh: syntax error at line 7: `L=$' unexpected

Toujours cet affreux command "garbled" sur mes autres tentatives :(

Lien vers le commentaire
Partager sur d’autres sites

bash-2.03# inpact.sh dumpHTTP
./inpact.sh: syntax error at line 7: `L=$' unexpected

Toujours cet affreux command "garbled" sur mes autres tentatives :(

si t'es sous solaris avec un vieux bash (2.03 c'est vieux) il faut juste remplacer les $() par dans `` (anti-quote d'execution)

Le reste devrait passer

Lien vers le commentaire
Partager sur d’autres sites

tu met l'interpreteur que tu veux, les $() passent uniquement en bash mais ton script indique d'utiliser sh (qui sous solaris est different de bash)

donc soit tu remplace les $() par des `` comme t'avais dans ton script et tu laisse en sh, vu que ton script est pas bien compliqué ya des chances qu'il passe en sh

soit tu laisse les $() et tu corrige le #!/bin/sh pour que ça pointe vers ton bash (which bash te donnera le chemin ça doit etre rangé dans un coin obscure sous solaris)

Lien vers le commentaire
Partager sur d’autres sites

#!/bin/bash

couleur=">\\\33[1;32m"
fincouleur="\\\33[0m<"
normal="\\33[0m"

while read ligne; do
L=$(echo $ligne | sed 's/>/'"$couleur"'/g' | sed 's/</'"$fincouleur"'/g')
echo -e $L
done < $1

echo -e $normal
exit 0;

C'est bon, le résultat est là, merci pour votre aide theocrite et madko.

Celà servira sans doute également à quelqu'un d'autre :p

Lien vers le commentaire
Partager sur d’autres sites

(which bash te donnera le chemin ça doit etre rangé dans un coin obscure sous solaris)
C'est un des rares trucs qui n'est pas trop obscure justement, pour des scripts de démarrage en bash me semble-t-il.

Ça doit être la raison qui fait qu'on ne trouve pas ça dans un coin tordu d'un /usr de solaris.

sur mon solaris le bash est dans /usr, mais bon /usr/bin c'est moins tordu que ce que jaurais pu penser :)

Lien vers le commentaire
Partager sur d’autres sites

(which bash te donnera le chemin ça doit etre rangé dans un coin obscure sous solaris)
C'est un des rares trucs qui n'est pas trop obscure justement, pour des scripts de démarrage en bash me semble-t-il.

Ça doit être la raison qui fait qu'on ne trouve pas ça dans un coin tordu d'un /usr de solaris.

Depuis solaris 8, les utilitaires gnu, quand ils sont installés, se trouvent dans /usr/sfw/bin...

Quand à bash, je suis pas au taf, je ne peux pas vérifier, mais pour scripter sur solaris, autant utiliser ksh qui à une syntaxe à peu près compatible, à quelques subtiles différences près.

Sinon, pour revenir au sujet, le script suivant (non testé sous solaris) est un peu plus élégant:

#!/usr/bin/env bash

couleur_balise="$(tput setf 2)"  ##vert
couleur_text="$(tput sgr0)"  

sed -e "s/>/>$couleur_text/g" -e "s/</$couleur_balise</g" "$1"

tput sgr0 ## reinitialise les params du terminal

Lien vers le commentaire
Partager sur d’autres sites

#!/bin/bash

strings fichier | tail -150 > /tmp/dump


vert=">\\\33[1;32m"
fincouleur="\\\33[0m<"
normal="\\33[0;37m"

while read ligne; do
L=$(echo $ligne | sed 's/>/'"$vert"'/g' | sed 's/</'"$fincouleur"'/g' )
echo -e $L
done < /tmp/dump

echo -e $normal

exit 0;

Un petit soucis, dans le fichier scanné, il existe des chaines "*/*"

Si par malheur, une ligne "sedée" en contient une, je me retrouve avec toute l'arborescence de mon disque qui défile à l'écran

J'ai bien tenté d'échappé le * ou le / mais rien à y faire ca persiste, ou ce fameux "command garbled" revient sans cesse.

Passer par les regexp pourrait il m'apporter la solution?

Merci

Lien vers le commentaire
Partager sur d’autres sites

#!/bin/bash

strings fichier | tail -150 > /tmp/dump


vert=">\\\33[1;32m"
fincouleur="\\\33[0m<"
normal="\\33[0;37m"

while read ligne; do
L=$(echo $ligne | sed 's/>/'"$vert"'/g' | sed 's/</'"$fincouleur"'/g' )
echo -e $L
done < /tmp/dump

echo -e $normal

exit 0;

Un petit soucis, dans le fichier scanné, il existe des chaines "*/*"

Si par malheur, une ligne "sedée" en contient une, je me retrouve avec toute l'arborescence de mon disque qui défile à l'écran

J'ai bien tenté d'échappé le * ou le / mais rien à y faire ca persiste, ou ce fameux "command garbled" revient sans cesse.

Passer par les regexp pourrait il m'apporter la solution?

Merci

tu peux nous donner un ptit exemple qui passe pas?

parceque moi si je teste avec le script et des chaines */* ça colore quand meme

Lien vers le commentaire
Partager sur d’autres sites

#!/bin/bash

strings fichier | tail -150 > /tmp/dump


vert=">\\\33[1;32m"
fincouleur="\\\33[0m<"
normal="\\33[0;37m"

while read ligne; do
L=$(echo $ligne | sed 's/>/'"$vert"'/g' | sed 's/</'"$fincouleur"'/g' )
echo -e $L
done < /tmp/dump

echo -e $normal

exit 0;

Un petit soucis, dans le fichier scanné, il existe des chaines "*/*"

Si par malheur, une ligne "sedée" en contient une, je me retrouve avec toute l'arborescence de mon disque qui défile à l'écran

J'ai bien tenté d'échappé le * ou le / mais rien à y faire ca persiste, ou ce fameux "command garbled" revient sans cesse.

Passer par les regexp pourrait il m'apporter la solution?

Merci

Utilise mon script ou mets des guillemets autour de $L.

echo -e "$L"

Lien vers le commentaire
Partager sur d’autres sites

désolé mais ton script ne fonctionne pas sur mon solaris djuke, il colore qqchose chez toi?

sinon ouai avec des guillemets ça devrait etre mieux

J'ai pas de machine solaris sous la main je suis en vacances...

Tu peux juste essayer de rajouter un

export TERM=dtterm

au début de mon script (après le sheebang bien sûr) et retester?

En tout cas sous linux il passe et préserve l'indentation...

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...