GNT sans publicité, site mobile, fonctionnalitées exclusives...

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.
Lire les 12 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
xtof pernod
Le #22367201
Le 17/07/2010 14:49, Xavier a fait rien qu'à écrire:
Bonjour,




Plop',

(...)
Et c'est là que ça se gâte. Je ne parviens pas à escaper les caractères [''] :




Il me souvient avoir cherché et n'avoir trouvé que cette ruse:
awk '{ c=sprintf("%c",0x27); gsub(c,"*"); print }'


Pourtant la doc de awk dit bien que le backslash est le caractère d'escape.



Ouais..


Y'a quoi que j'ai pas compris ?



J'sais pô ! J'ai jamais su -- même avec set -x -- qui bouffait ces foutus
simples quotes. Le shell ? awk ? /dev/null ?


Merci,




De rien

--
christophe.
Nicolas George
Le #22367191
Xavier wrote in message
{ print $1" "$2" " gsub("[", "", >>> $10) <<<
Pourtant la doc de awk dit bien que le backslash est le caractère d'escape.



~ $ 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.
xavier
Le #22367351
Nicolas George
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.
xtof pernod
Le #22367341
Le 17/07/2010 15:09, xtof pernod a fait rien qu'à écrire:
Le 17/07/2010 14:49, Xavier a fait rien qu'à écrire:



(Oups.. j'ai lu un peu vite, je reprends -- bien q'amha, pour une simple
supression de caracteres, tr -d "[']" le fera.)

Et c'est là que ça se gâte. Je ne parviens pas à escaper les caractères [''] :






En fait c'est les /chaines/ "['" et "']" que tu veux bouffer..


Il me souvient avoir cherché et n'avoir trouvé que cette ruse:
awk '{ c=sprintf("%c",0x27); gsub(c,"*"); print }'



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.
Nicolas George
Le #22367551
Xavier wrote in message
Donc, point de salut hors du sprintf suggéré par 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.
Publicité
Suivre les réponses
Poster une réponse
Anonyme