OVH Cloud OVH Cloud

Parser une ligne avec des clés=valeurs contenant des espaces (csh)

Aucune réponse
Avatar
Kevin Denis
Bonjour,

je dois parser des lignes de log construites sur un schéma clé=valeur
ressemblant à:

id=AAA type=BBB value=CCC msg=\"aaa bbb ccc ddd eee\" value2=xxx
value3=\"eee eee eee\"
id=AA2 type=BB2 value=CC2 value2=xx2 value3=\"eee eee eee\"
etc...

Les lignes n\'ont pas forcément toutes les clés renseignées.

Je souhaite parser ces lignes pour n\'en conserver qu\'une partie, par
exemple msg, id, value2 et value3. Je ne trouve pas de moyen simple
pour parser ces lignes. Mon plus gros problème vient des espaces dans
certaines valeurs et de l\'absence de clés dans d\'autres.
J\'en ai besoin pour faire:

tail -f /var/log/my_log | parse_line.sh

C\'est sous FreeBSD, avec csh (pas de bash disponible) et les utilitaires
classiques (sed, cut, awk, etc..)

Merci
--
Kevin

5 réponses

1 2
Avatar
Benoit Izac
Bonjour,

le 27/03/2015 à 12:59, Lucas Levrel a écrit dans le message
:

while read LINE



Ça commence mal si la ligne contient des backslashes.

do
MSG=$(echo $LINE | grep -E -o ...)



Et ça continue de même.



Sans doute. Comme les points de suspension le suggèrent, ce sont des
pistes.

En l'occurence, seul l'OP sait ce qu'il est susceptible d'y avoir.



Je suppose que Nicolas faisait allusion au fait qu'il serait plus
prudent d'utiliser l'option -r de read afin de ne pas faire de
traitement spécial sur les backslashes (typiquement les retirer sauf
s'il y en a deux consécutifs) ou encore qu'il est toujours hasardeux
d'utiliser une variable qui n'est pas entourée de double quote (dès
qu'il y a des espaces par exemple).

Peut-être pensait-il également qu'il serait préférable d'utiliser printf
à la place d'echo afin d'avoir un comportement uniforme sur les
différents shell qui peuvent proposer un mode sh ? Lui seul le sait et
c'est bien ça le problème me semble-t-il.

while read -r LINE; do
MSG=$(printf '%sn' "$LINE" | grep -E -o ...)
done

--
Benoit Izac
Avatar
Nicolas George
Benoit Izac , dans le message , a écrit :
Je suppose que Nicolas faisait allusion au fait qu'il serait plus
prudent d'utiliser l'option -r de read afin de ne pas faire de
traitement spécial sur les backslashes (typiquement les retirer sauf
s'il y en a deux consécutifs) ou encore qu'il est toujours hasardeux
d'utiliser une variable qui n'est pas entourée de double quote (dès
qu'il y a des espaces par exemple).

Peut-être pensait-il également qu'il serait préférable d'utiliser printf
à la place d'echo afin d'avoir un comportement uniforme sur les
différents shell qui peuvent proposer un mode sh ?



Je crois que tu n'as rien oublié.

Lui seul le sait et
c'est bien ça le problème me semble-t-il.



Mon but n'était pas de faire un cours de shell, il y en a probablement plein
le web. Mon but était de faire remarquer à certains interlocuteurs qu'ils
auraient besoin de lire un cours de shell, au moins un abrégé sur les
erreurs classiques et comment les éviter.
Avatar
Doug713705
Le 27-03-2015, Nicolas George nous expliquait dans
fr.comp.os.unix
(<5515ce73$0$3305$) :

Mon but n'était pas de faire un cours de shell, il y en a probablement plein
le web. Mon but était de faire remarquer à certains interlocuteurs qu'ils
auraient besoin de lire un cours de shell, au moins un abrégé sur les
erreurs classiques et comment les éviter.



Le problème est que ta remarque, comme souvent, ne pointe aucun problème
particulier. Elle suggère la présence d'une erreur mais ne donne aucune
indication, pas même une pîste vers laquelle s'orienter.

Elle n'a donc aucun portée effective car tout le monde a plus ou moins
besoin de (re)lire un cours de shell et ce n'est en rien une nouvelle.

C'est un peu comme répondre "Oui" à quelqu'un qui te demande l'heure ;-)

--
Mais l'ombre des plaisirs s'enfuit
Toujours plus loin vers l'inconnu.
-- H.F. Thiéfaine, La môme kaléïdoscope
Avatar
caterina123
Le mercredi 25 Mars 2015 à 10:37 par Kevin Denis :
Bonjour,

je dois parser des lignes de log construites sur un schéma
clé=valeur
ressemblant à:

idªA type»B valueÌC msg="aaa bbb ccc ddd eee" value2=xxx
value3="eee eee eee"
idª2 type»2 valueÌ2 value2=xx2 value3="eee eee eee"
etc...

Les lignes n'ont pas forcément toutes les clés
renseignées.

Je souhaite parser ces lignes pour n'en conserver qu'une partie, par
exemple msg, id, value2 et value3. Je ne trouve pas de moyen simple
pour parser ces lignes. Mon plus gros problème vient des espaces dans
certaines valeurs et de l'absence de clés dans d'autres.
J'en ai besoin pour faire:

tail -f /var/log/my_log | parse_line.sh

C'est sous FreeBSD, avec csh (pas de bash disponible) et les utilitaires
classiques (sed, cut, awk, etc..)

Merci
--
Kevin


Bonjour Madame / Monsieur,

Je lance un appel à toutes les personnes qui ont besoin de financement pour leur exprimer que je prête de l'argent 2000-3.000.000 D'Euros crédible à toute personne capable de
rembourser avec intérêt au taux de 2% par an et les périodes allant de 1 à 35 ans, selon de la quantité requise. Je le fais dans les domaines suivants:

- Prêt financière
- Hypothèque
- Investissement de prêt
- Prêt automobile
- Consolidation de la dette
- Rachat de crédit
- Prêt personnel
- Vous êtes dans l'archive

Vous êtes fichés, interdits bancaires et vous n'avez pas la faveur des banques ou mieux vous avez un projet et besoin de financement, un mauvais dossier de crédit ou besoin d'argent pour payer des factures, fonds à investir sur les entreprises.
Notre site web : www.investissement-pep.com
E-mail:
Nous sommes en mesure de satisfaire mes clients dans les 48 heures suivant la réception de votre demande de crédit bien formulé. Si vous avez vraiment besoin d'argent pour faire ce prêt en bon état Veuillez me contacter tôt aujourd'hui pour obtenir votre prêt.
PS / mais pas sérieuse s'abstenir.
Donc, je suis impatient de vos demandes.
Merci pour la compréhension
Avatar
caterina123
Le mercredi 25 Mars 2015 à 10:37 par Kevin Denis :
Bonjour,

je dois parser des lignes de log construites sur un schéma
clé=valeur
ressemblant à:

idªA type»B valueÌC msg="aaa bbb ccc ddd eee" value2=xxx
value3="eee eee eee"
idª2 type»2 valueÌ2 value2=xx2 value3="eee eee eee"
etc...

Les lignes n'ont pas forcément toutes les clés
renseignées.

Je souhaite parser ces lignes pour n'en conserver qu'une partie, par
exemple msg, id, value2 et value3. Je ne trouve pas de moyen simple
pour parser ces lignes. Mon plus gros problème vient des espaces dans
certaines valeurs et de l'absence de clés dans d'autres.
J'en ai besoin pour faire:

tail -f /var/log/my_log | parse_line.sh

C'est sous FreeBSD, avec csh (pas de bash disponible) et les utilitaires
classiques (sed, cut, awk, etc..)

Merci
--
Kevin


Bonjour Madame / Monsieur,

Je lance un appel à toutes les personnes qui ont besoin de financement pour leur exprimer que je prête de l'argent 2000-3.000.000 D'Euros crédible à toute personne capable de
rembourser avec intérêt au taux de 2% par an et les périodes allant de 1 à 35 ans, selon de la quantité requise. Je le fais dans les domaines suivants:

- Prêt financière
- Hypothèque
- Investissement de prêt
- Prêt automobile
- Consolidation de la dette
- Rachat de crédit
- Prêt personnel
- Vous êtes dans l'archive

Vous êtes fichés, interdits bancaires et vous n'avez pas la faveur des banques ou mieux vous avez un projet et besoin de financement, un mauvais dossier de crédit ou besoin d'argent pour payer des factures, fonds à investir sur les entreprises.
Notre site web : www.investissement-pep.com
E-mail:
Nous sommes en mesure de satisfaire mes clients dans les 48 heures suivant la réception de votre demande de crédit bien formulé. Si vous avez vraiment besoin d'argent pour faire ce prêt en bon état Veuillez me contacter tôt aujourd'hui pour obtenir votre prêt.
PS / mais pas sérieuse s'abstenir.
Donc, je suis impatient de vos demandes.
Merci pour la compréhension
1 2