je souhaite rediriger l'affichage d'un fichier sur gawk.
Ma ligne de commande est la suivante:
cat MyLogFile.txt | gawk '/ERROR/ { print $0 }'
Ca marche comme je veux.
J'ai besoin de faire un cat parce qu'après je vais le remplacer par tail
-f dans un script ou je choisis la commande cat ou tail -f.
Et c'est justement avec un script que tout merde.
----------------------
SCRIPT BEGIN
----------------------
#!/bin/bash
# Mes variables
COMMAND=cat
PATTERN="gawk '/ERROR/ { print \$0 }'"
# J'obtiens exactement la ligne de commande que
# j'ai tapé directement dans le shell
echo "${COMMAND} MyLogFile | $PATTERN"
${COMMAND} MyLogFile | $PATTERN
----------------------
SCRIPT END
----------------------
à l'exécution, j'obtiens systématiquement
gawk: cmd. line:1: '/ERROR/
gawk: cmd. line:1: ^ invalid char ''' in expression
J'ai cherché dans tous les sens. Je n'y comprends plus rien.
Ca doit être une toute petite bétise. Quelqu'un peut m'aider ?
à l'exécution, j'obtiens systématiquement gawk: cmd. line:1: '/ERROR/ gawk: cmd. line:1: ^ invalid char ''' in expression [...]
Ben oui forcément. À l'expansion de $PATTERN, le shell fait du découpage (et eventuellement de la filename generation) pas de l'interprétation de code shell.
à l'exécution, j'obtiens systématiquement
gawk: cmd. line:1: '/ERROR/
gawk: cmd. line:1: ^ invalid char ''' in expression
[...]
Ben oui forcément. À l'expansion de $PATTERN, le shell fait du
découpage (et eventuellement de la filename generation) pas de
l'interprétation de code shell.
à l'exécution, j'obtiens systématiquement gawk: cmd. line:1: '/ERROR/ gawk: cmd. line:1: ^ invalid char ''' in expression [...]
Ben oui forcément. À l'expansion de $PATTERN, le shell fait du découpage (et eventuellement de la filename generation) pas de l'interprétation de code shell.
eval est là pour interpréter du code shell. Voir "info bash"
-- Stéphane
Jeannot Lelapin
Merci pour ta réponse et tes explications.
Je suis finalement arrivé à mes fins avec la première solution.
Mon script maintenant complet permet de filtrer mes logs comme je le souhaite. Il est certe rudimentaire car je ne maitrise absolument pas les regexp, sed,... Il faudra de toute façon que je m'y mette. Je débute aussi dans l'écriture des scripts shell et en bash.
# 2003.10.12 # L'analysis d'un fichier de log générée avec log4cpp # Le script est basé sur la recherche des mots clés : # EMERG, FATAL, ALERT, CRIT, ERROR, WARN, NOTICE, INFO, DEBUG, NOTSET
# Le paramètre 1 : le nom du fichier à analyser # Le paramètre 2 : l'utilisation de cat ou tail # pour tail, l'option -f est rajoutée # Le paramètre 3 : le niveau de trace recherché ( les traces de priorité # supérieure à celles choisies sont elle aussi affichées )
# La vérification du nombre d'arguments if ! [ $(($#)) == 3 ] ; then echo "FAILURE : LogAnalyser.sh cat/tail priority filename" exit 1 fi
# La vérification de la présence du fichier à analyser if ! [ -f $1 ] ; then echo "FAILURE : $1 doesn't exist" exit 1 fi
# La vérification de la possibilité de lecture du fichier à analyser if ! [ -r $1 ] ; then echo "FAILURE : $1 isn't available for reading" exit 1 fi
# La vérification du mode choisi case "$2" in cat) COMMAND='cat' ;; tail) COMMAND='tail§-f' ;; *) echo "FAILURE : arg 2 : $1 doesn't match cat or tail" exit 1 ;; esac
# L'exécution de la commande $COMMAND $1 | $PATTERN
Merci pour ta réponse et tes explications.
Je suis finalement arrivé à mes fins avec la première solution.
Mon script maintenant complet permet de filtrer mes logs comme je le
souhaite. Il est certe rudimentaire car je ne maitrise absolument pas
les regexp, sed,... Il faudra de toute façon que je m'y mette.
Je débute aussi dans l'écriture des scripts shell et en bash.
# 2003.10.12
# L'analysis d'un fichier de log générée avec log4cpp
# Le script est basé sur la recherche des mots clés :
# EMERG, FATAL, ALERT, CRIT, ERROR, WARN, NOTICE, INFO, DEBUG, NOTSET
# Le paramètre 1 : le nom du fichier à analyser
# Le paramètre 2 : l'utilisation de cat ou tail
# pour tail, l'option -f est rajoutée
# Le paramètre 3 : le niveau de trace recherché ( les traces de priorité
# supérieure à celles choisies sont elle aussi affichées )
# La vérification du nombre d'arguments
if ! [ $(($#)) == 3 ] ; then
echo "FAILURE : LogAnalyser.sh cat/tail priority filename"
exit 1
fi
# La vérification de la présence du fichier à analyser
if ! [ -f $1 ] ; then
echo "FAILURE : $1 doesn't exist"
exit 1
fi
# La vérification de la possibilité de lecture du fichier à analyser
if ! [ -r $1 ] ; then
echo "FAILURE : $1 isn't available for reading"
exit 1
fi
# La vérification du mode choisi
case "$2" in
cat)
COMMAND='cat'
;;
tail)
COMMAND='tail§-f'
;;
*)
echo "FAILURE : arg 2 : $1 doesn't match cat or tail"
exit 1
;;
esac
Je suis finalement arrivé à mes fins avec la première solution.
Mon script maintenant complet permet de filtrer mes logs comme je le souhaite. Il est certe rudimentaire car je ne maitrise absolument pas les regexp, sed,... Il faudra de toute façon que je m'y mette. Je débute aussi dans l'écriture des scripts shell et en bash.
# 2003.10.12 # L'analysis d'un fichier de log générée avec log4cpp # Le script est basé sur la recherche des mots clés : # EMERG, FATAL, ALERT, CRIT, ERROR, WARN, NOTICE, INFO, DEBUG, NOTSET
# Le paramètre 1 : le nom du fichier à analyser # Le paramètre 2 : l'utilisation de cat ou tail # pour tail, l'option -f est rajoutée # Le paramètre 3 : le niveau de trace recherché ( les traces de priorité # supérieure à celles choisies sont elle aussi affichées )
# La vérification du nombre d'arguments if ! [ $(($#)) == 3 ] ; then echo "FAILURE : LogAnalyser.sh cat/tail priority filename" exit 1 fi
# La vérification de la présence du fichier à analyser if ! [ -f $1 ] ; then echo "FAILURE : $1 doesn't exist" exit 1 fi
# La vérification de la possibilité de lecture du fichier à analyser if ! [ -r $1 ] ; then echo "FAILURE : $1 isn't available for reading" exit 1 fi
# La vérification du mode choisi case "$2" in cat) COMMAND='cat' ;; tail) COMMAND='tail§-f' ;; *) echo "FAILURE : arg 2 : $1 doesn't match cat or tail" exit 1 ;; esac