OVH Cloud OVH Cloud

Commande awk ou egrep

9 réponses
Avatar
Gérard Aubry
Bonjour,
Sur une machine Linux j'ai un fichier de logs qui n'a pas de champ fixe
et dont le séparateur de champs est : '
Ce caractère peut malheureusement se retrouver dans le texte brut de ce
log.
Le dernier champs du fichier est le champ de taille des fichiers,
j'aimerais extraire les chiffres de la taille (uniquement les chiffres)
afin de pouvoir les additionner.
La taille est toujours entourés des mots size et bytes.
J'ai essayé avec awk mais quand un caractère ' est présent dans la ligne
ça me fausse tout.

Exemple de ligne
[02:38:31 AM 10/01/2003] Message 'T6501eb8e0dc0a801014f0' from
'clgjaifaejb@yahoo.com' to 'YYY@XXX.com' entitled 'p Porn Movie Heaven:
Sylvia Swallows Rocco's Load!' classification 'In SPAM' size 5739 bytes.



Voilà, en espérant avoir été clair
Merci d'avance de votre réponse

9 réponses

Avatar
Etienne PIERRE
On mer, 12 nov 2003, Gérard Aubry wrote:
Le dernier champs du fichier est le champ de taille des fichiers,
j'aimerais extraire les chiffres de la taille (uniquement les chiffres)
afin de pouvoir les additionner.
La taille est toujours entourés des mots size et bytes.
J'ai essayé avec awk mais quand un caractère ' est présent dans la ligne
ça me fausse tout.

Exemple de ligne
[02:38:31 AM 10/01/2003] Message 'T6501eb8e0dc0a801014f0' from
'' to '' entitled 'p Porn Movie Heaven:
Sylvia Swallows Rocco's Load!' classification 'In SPAM' size 5739 bytes.




Je pense qu'un petit

sed -ne 's/.*size ([0-9][0-9]*)bytes$/1/p' fichier.log

devrait faire l'affaire.


Etienne

--
Etienne PIERRE "etienne.pierre" arobase "tuxfamily.org"

Avatar
Stephane Chazelas
2003/11/12, 15:33(+01), Gérard Aubry:
[...]
La taille est toujours entourés des mots size et bytes.
J'ai essayé avec awk mais quand un caractère ' est présent dans la ligne
ça me fausse tout.

Exemple de ligne
[02:38:31 AM 10/01/2003] Message 'T6501eb8e0dc0a801014f0' from
'' to '' entitled 'p Porn Movie Heaven:
Sylvia Swallows Rocco's Load!' classification 'In SPAM' size 5739 bytes.
[...]


Si tu veux juste faire une somme de tous les "bytes", tu n'as
pas besoin de spécifier « ' » comme séparateur de champs.

awk '$NF == "bytes." && $(NF-2) == "size" {total+=$(NF-1)}
END {print total}'

Meme si tu spécifies « ' » comme séparateur de champs, tu peux
toujours accéder à " size 5739 bytes" par $NF. Tu peux utiliser
split() ensuite pour en extraire le nombre de bytes.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Gérard Aubry
Merci de votre aide,
les commandes que vous me proposé n'on pas d'erreur de syntaxe mais je ne
récupère rien à l'écran de même si je redirige le résultat dans un fichier.



Bonjour,
Sur une machine Linux j'ai un fichier de logs qui n'a pas de champ fixe
et dont le séparateur de champs est : '
Ce caractère peut malheureusement se retrouver dans le texte brut de ce
log.
Le dernier champs du fichier est le champ de taille des fichiers,
j'aimerais extraire les chiffres de la taille (uniquement les chiffres)
afin de pouvoir les additionner.
La taille est toujours entourés des mots size et bytes.
J'ai essayé avec awk mais quand un caractère ' est présent dans la ligne
ça me fausse tout.

Exemple de ligne
[02:38:31 AM 10/01/2003] Message 'T6501eb8e0dc0a801014f0' from
'' to '' entitled 'p Porn Movie Heaven:
Sylvia Swallows Rocco's Load!' classification 'In SPAM' size 5739 bytes.

Voilà, en espérant avoir été clair
Merci d'avance de votre réponse


Avatar
Etienne PIERRE
On mer, 12 nov 2003, Etienne PIERRE wrote:
sed -ne 's/.*size ([0-9][0-9]*)bytes$/1/p' fichier.log
avec un espace en plus :

sed -ne 's/.*size ([0-9][0-9]*) bytes$/1/p' fichier.log

chez moi ça marche :

$ echo "[02:38:31 AM 10/01/2003] Message 'T6501eb8e0dc0a801014f0' from
'' to '' entitled 'p Porn Movie Heaven:
Sylvia Swallows Rocco's Load!' classification 'In SPAM' size 5739
bytes" | sed -ne 's/.*size ([0-9][0-9]*) bytes/1/p'
5739



Etienne


--
Etienne PIERRE "etienne.pierre" arobase "tuxfamily.org"

Avatar
Stephane Chazelas
2003/11/12, 16:16(+01), Gérard Aubry:
les commandes que vous me proposé n'on pas d'erreur de syntaxe mais je ne
récupère rien à l'écran de même si je redirige le résultat dans un fichier.
[...]


[Merci de poster à l'endroit]

Qu'est-ce que tu lances exactement ? Est-ce que ton fichier de
log est un fichier DOS ou UNIX, pourrais-tu poster le résultat
du :

cat -nvte < fichier.log | head

pour qu'on y voie un peu plus clair ?

Note que pour awk ou grep, il faut passer le nom du fichier en
argument ou son contenu sur l'entrée standard.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Gérard Aubry
Il s'agit d'un message multivolet au format MIME.
--------------D7411870BCA9418CCEC41A80
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit


2003/11/12, 16:16(+01), Gérard Aubry:
les commandes que vous me proposé n'on pas d'erreur de syntaxe mais je ne
récupère rien à l'écran de même si je redirige le résultat dans un fichier.
[...]


[Merci de poster à l'endroit]

Qu'est-ce que tu lances exactement ? Est-ce que ton fichier de
log est un fichier DOS ou UNIX, pourrais-tu poster le résultat
du :

cat -nvte < fichier.log | head

pour qu'on y voie un peu plus clair ?

Note que pour awk ou grep, il faut passer le nom du fichier en
argument ou son contenu sur l'entrée standard.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Voici la ligne que je lance, Groupe.001 étant mon log qui lui même est le
résultat d'une commande cat (il est lisible par vi), je redirige le résultat vers
le fichier resultat.txt qui reste désespérément vide

[ Concatenation]# awk '$NF == "bytes." && $(NF-2) == "size"
{total+=$(NF-1)} END {print total}' Groupe.001 >resultat.txt

ci joint le fichier résultat de la commande que tu m'a demande

--------------D7411870BCA9418CCEC41A80
Content-Type: text/plain; charset=us-ascii;
name="fic"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="fic"

1 [01:34:25 AM 10/01/2003] Message 'T6501b0deadc0a801014f0' from '' to '' entitled 'Quicken Loans has received your Mortgage Inquiry' classification 'In Groupes Hager' size 1501 bytes.^M$
2 [01:40:46 AM 10/01/2003] Message 'T6501b6aee5c0a801014f0' from '' to '' entitled 'Second Notice!!Urgent' classification 'In Groupes Hager' size 1457 bytes.^M$
3 [04:13:37 PM 10/01/2003] Message 'T6504d5cc81c0a801015e0' from '' to '' entitled 'Information Needed to Refinance Your Home' classification 'In Groupes Hager' size 2545 bytes.^M$
4 [08:31:11 AM 10/02/2003] Message 'T650854c471c0a801015e0' from '' to '' entitled '' classification 'In Groupes Hager' size 156866 bytes.^M$
5 [07:56:13 PM 10/03/2003] Message 'T650fee4fc5c0a801011e0' from '' to '' entitled 'Information Needed to Refinance Your Home' classification 'In Groupes Hager' size 2545 bytes.^M$
6 [03:14:17 AM 10/04/2003] Message 'T65117f60bec0a801011e0' from '' to '' entitled 'InterScan NT Alert' classification 'In Groupes Hager' size 1144 bytes.^M$
7 [08:40:37 AM 10/04/2003] Message 'T6512aa23c6c0a801011e0' from '' to '' entitled 'InterScan NT Alert' classification 'In Groupes Hager' size 1144 bytes.^M$
8 [12:49:44 AM 10/05/2003] Message 'T6516216653c0a801011e0' from '' to '' entitled 'InterScan NT Alert' classification 'In Groupes Hager' size 706 bytes.^M$
9 [04:04:11 PM 10/05/2003] Message 'T65196699a0c0a801011e0' from '' to '' entitled 'InterScan NT Alert' classification 'In Groupes Hager' size 703 bytes.^M$
10 [06:24:05 PM 10/05/2003] Message 'T6519e6afe9c0a801011e0' from '' to '' entitled 'InterScan NT Alert' classification 'In Groupes Hager' size 716 bytes.^M$

--------------D7411870BCA9418CCEC41A80--


Avatar
Stephane Chazelas
2003/11/13, 09:45(+01), Gérard Aubry:
Il s'agit d'un message multivolet au format MIME.
--------------D7411870BCA9418CCEC41A80


Pas une bonne idée sur usenet.

[...]
[ Concatenation]# awk '$NF == "bytes." && $(NF-2) == "size"
{total+=$(NF-1)} END {print total}' Groupe.001 >resultat.txt

ci joint le fichier résultat de la commande que tu m'a demande

[...]

1 [01:34:25 AM 10/01/2003] Message 'T6501b0deadc0a801014f0' from '' to '' entitled 'Quicken Loans has received your Mortgage Inquiry' classification 'In Groupes Hager' size 1501 bytes.^M$
[...]


Le ^M en fin de ligne indique que c'est un fichier DOS (où le
séparateur de ligne est CRLF ou lieu de LF sous Unix). Remplace
la commande par:

awk '$NF == "bytes.r" && $(NF-2) == "size"
{total+=$(NF-1)} END {print total}' Groupe.001 >resultat.txt

Ou convertit d'abord le fichier en fichier Unix (en enlevant les
^M aka CR aka r).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Gérard Aubry

2003/11/13, 09:45(+01), Gérard Aubry:
Il s'agit d'un message multivolet au format MIME.
--------------D7411870BCA9418CCEC41A80


Pas une bonne idée sur usenet.

[...]
[ Concatenation]# awk '$NF == "bytes." && $(NF-2) == "size"
{total+=$(NF-1)} END {print total}' Groupe.001 >resultat.txt

ci joint le fichier résultat de la commande que tu m'a demande

[...]

1 [01:34:25 AM 10/01/2003] Message 'T6501b0deadc0a801014f0' from '' to '' entitled 'Quicken Loans has received your Mortgage Inquiry' classification 'In Groupes Hager' size 1501 bytes.^M$
[...]


Le ^M en fin de ligne indique que c'est un fichier DOS (où le
séparateur de ligne est CRLF ou lieu de LF sous Unix). Remplace
la commande par:

awk '$NF == "bytes.r" && $(NF-2) == "size"
{total+=$(NF-1)} END {print total}' Groupe.001 >resultat.txt

Ou convertit d'abord le fichier en fichier Unix (en enlevant les
^M aka CR aka r).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Super ça fonctionne Merci pour tout.
Peut tu si tu le veut bien m'expliquer la syntaxe exacte de ta commande .........
Merci


Avatar
Stephane Chazelas
2003/11/13, 10:25(+01), Gérard Aubry:

[...]



[Tu n'étais pas obligé de citer tout mon message (surtout ma
signature !), je rappelle qu'on ne met dans un message que ce
qu'on veut être lu.]

Peut tu si tu le veut bien m'expliquer la syntaxe exacte de ta commande .........


[tes lignes sont trop longues, sur usenet on se limite au plus à
80 caractères, de préférence 64 pour permettre des citations
multiples sans dépasser les 80 caractères, en plus, ça facilite
la lecture]

$<n> est le <n>ieme champ sur la ligne. NF est le nombre de
champs sur la ligne. Donc $NF est le dernier champ, $(NF-1)
l'avant-dernier, etc.

$NF == "bytes.r" && $(NF-2) == "size" {total+=$(NF-1)}

Pour chaque ligne, si le dernier champ est "bytes.r" (où r est
le caractère CR de numéro 13), et que l'avant-avant-dernier est
"size", alors incrémenter la variable "total" de la valeur de
l'avant-dernier champ.

END { print total }

À la fin (après que la dernière ligne ait été lue), on affiche
la valeur de la variable "total" suivie d'un saut de ligne (LF,
NL, ^J, n).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]