Souci awk et builtins

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

10 réponses

1 2
Avatar
xtof pernod
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.
Avatar
Nicolas George
Xavier wrote in message <1jls33e.uaqy0i1pt2gchN%:
{ 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.
Avatar
xavier
Nicolas George <nicolas$ wrote:

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.
Avatar
xtof pernod
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.
Avatar
Nicolas George
Xavier wrote in message <1jls553.m8bpoc1hjgemmN%:
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.
Avatar
Benoit Izac
Bonjour,

le 17/07/2010 à 14:49, (Xavier) a écrit dans le
message <1jls33e.uaqy0i1pt2gchN% :

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
Avatar
Benoit Izac
Dans le message , le 17/07/2010 à 18:35, j'ai
é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
Avatar
xavier
Benoit Izac wrote:

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.
Avatar
Cyrille Lefevre
Le 17/07/2010 15:11, Nicolas George a écrit :
Xavier wrote in message<1jls33e.uaqy0i1pt2gchN%:
{ 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.
Avatar
Cyrille Lefevre
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.
1 2