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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
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.
Benoit Izac
Le #22368111
Bonjour,

le 17/07/2010 à 14:49, (Xavier) a écrit dans le
message
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 [''] :



C'est peu lisible mais ça vire bien « [' » et « '] » :

awk '{sub("\['''", ""); sub("'']'", ""); print $1" "$2" "$10}'

--
Benoit Izac
Benoit Izac
Le #22368101
Dans le message écrit :

C'est peu lisible mais ça vire bien « [' » et « '] » :

awk '{sub("\['''", ""); sub("'']'", ""); print $1" "$2" "$10}'



En bien plus lisible :
awk '{gsub("[^0-9.]", "", $10); print $1" "$2" "$10}'

--
Benoit Izac
xavier
Le #22368361
Benoit Izac
gsub("[^0-9.]"



Arrrgh ! Pourquoi n'y avais-je pas pensé ! Le genre de truc qui me vient
tout de suite à l'esprit quand je bosses avec des PCRE, mais là, outil
pas familier, toussa ..

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.
Cyrille Lefevre
Le #22369621
Le 17/07/2010 15:11, Nicolas George a écrit :
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.



Bonjour,

plus précisément, en awk, il existe 2 notation en ce qui concerne
les expressions rationnelles : /.../ et "..."
dans le cas des ", il faut doubler les pour la raison énoncée
ci-dessus, ce qui donne : /[/ == "\["
pour sub/gsub, il faudrait idéalement toujours utiliser des /.../, pb s i
la partie droite est variable, ce qui oblige de passer en mode ".

ex. (tous équivalent) :

gsub(/[/, "")

gsub("\[", "")

se="\["; re=""
gsub(se, re)

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Cyrille Lefevre
Le #22369611
Le 17/07/2010 15:32, xtof pernod a écrit :
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 simpl e
supression de caracteres, tr -d "[']" le fera.)



attention, selon l'os, cela peut ne correspondre qu'à ', cf. RATIONALE
dans http://www.opengroup.org/onlinepubs/9699919799/utilities/tr.html

mieux vaut écrire "'[]" afin d'éviter toutes ambiguïtés...

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); }



0x... n'est pas portable en awk... gnu ok sauf si --posix, pas les autres .

solution simple et portable :

awk -v q="'" -v dq='"' '{c=q}
{ sub( "\[" c, "" ); sub( c "\]", "" ); print }'
sqdfqsdf ['kjjmlkjmlk'] xx
sqdfqsdf kjjmlkjmlk xx

(double '' pour qu'un arrive jusqu'à gsub() =)



Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Publicité
Poster une réponse
Anonyme