Souci awk et builtins
Le
xavier
Bonjour,
Parti de la constation que c'était gavant que denyhosts m'envoie une vingtaine de
mails par jour, j'ai désactivé la fonction mail, et rajouté un script dans
periodic/security.
La sortie brute de
$ grep -i "^$yesterday.*new denied hosts" /var/log/denyhosts
donne :
2010-07-16 03:22:35,908 - denyhosts : INFO new denied hosts: ['61.168.222.222']
Bon, pas dur, en pipant dans awk '{ print $1" "$2" "$10}' j'obtiens :
2010-07-16 03:22:35,908 ['61.168.222.222']
qui est nettement plus concis. Maintenant, comme il me reste un ou deux drosos sous
la main, je voudrais nettoyer les [''] pour passer le résultat à un resolveur
quelconque.
Et c'est là que ça se gâte. Je ne parviens pas à escaper les caractères [''] :
awk '{ print $1" "$2" "gsub("\[", "", $10)}'
awk: nonterminated character class [
source line number 1
context is
{ print $1" "$2" " gsub("\[", "", >>> $10) <<<
Pourtant la doc de awk dit bien que le backslash est le caractère d'escape.
Y'a quoi que j'ai pas compris ? C'est vrai que awk n'est pas mon truc de tous les
jours, je suis un "one liner", et je le ferais sans doute en 5 mn en Perl. Mais si je
mourais demain, je serais aussi bête qu'aujourd'hui, et ça c'est pas bon pour le
karma :-)
Merci,
--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
Parti de la constation que c'était gavant que denyhosts m'envoie une vingtaine de
mails par jour, j'ai désactivé la fonction mail, et rajouté un script dans
periodic/security.
La sortie brute de
$ grep -i "^$yesterday.*new denied hosts" /var/log/denyhosts
donne :
2010-07-16 03:22:35,908 - denyhosts : INFO new denied hosts: ['61.168.222.222']
Bon, pas dur, en pipant dans awk '{ print $1" "$2" "$10}' j'obtiens :
2010-07-16 03:22:35,908 ['61.168.222.222']
qui est nettement plus concis. Maintenant, comme il me reste un ou deux drosos sous
la main, je voudrais nettoyer les [''] pour passer le résultat à un resolveur
quelconque.
Et c'est là que ça se gâte. Je ne parviens pas à escaper les caractères [''] :
awk '{ print $1" "$2" "gsub("\[", "", $10)}'
awk: nonterminated character class [
source line number 1
context is
{ print $1" "$2" " gsub("\[", "", >>> $10) <<<
Pourtant la doc de awk dit bien que le backslash est le caractère d'escape.
Y'a quoi que j'ai pas compris ? C'est vrai que awk n'est pas mon truc de tous les
jours, je suis un "one liner", et je le ferais sans doute en 5 mn en Perl. Mais si je
mourais demain, je serais aussi bête qu'aujourd'hui, et ça c'est pas bon pour le
karma :-)
Merci,
--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.

Poser une question


Plop',
Il me souvient avoir cherché et n'avoir trouvé que cette ruse:
awk '{ c=sprintf("%c",0x27); gsub(c,"*"); print }'
Ouais..
J'sais pô ! J'ai jamais su -- même avec set -x -- qui bouffait ces foutus
simples quotes. Le shell ? awk ? /dev/null ?
De rien
--
christophe.
~ $ awk 'BEGIN{print "["}'
awk: warning: escape sequence `[' treated as plain `['
[
La fonction gsub ne voit jamais le caractère backslash, il a déjà été
interprété par le parseur de chaînes de caractères.
Donc, point de salut hors du sprintf suggéré par Christophe ?
Ca va donc se terminer en Perl :-)
Merci,
--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Oups.. j'ai lu un peu vite, je reprends -- bien q'amha, pour une simple
supression de caracteres, tr -d "[']" le fera.)
En fait c'est les /chaines/ "['" et "']" que tu veux bouffer..
Et donc pour ton cas de figure:
# awk 'BEGIN { c=sprintf("%c",0x27); }
{ sub( "\[" c, "" ); sub( c "\]", "" ); print }'
sqdfqsdf ['kjjmlkjmlk'] xx
sqdfqsdf kjjmlkjmlk xx
(double '' pour qu'un arrive jusqu'à gsub() =)
--
christophe.
Bien sûr que si : se débrouiller pour que la chaîne de caractère passée à
gsub contienne le caractère . Il y a une manière standard et documentée de
le faire, et le warning affiché indique où chercher.