Benoit T écrivait :
[...]
> petit problème de construction d'expression regulière :
rationnelle, tu veux dire ?
>
> j'un fichier qui contient des logs de connexions, je veux supprimer les
> lignes concernant les connexions locales.
>
> le fichier ressemble à ça :
>
> Nov 16 09:18:21 port 49006 UDP datagram from 212.21.255.76
> Nov 16 09:19:04 last message repeated 4 time(s)
> Nov 16 09:19:04 netbios-ns UDP datagram from 192.168.2.23
> Nov 16 09:19:12 last message repeated 19 time(s)
> Nov 16 09:37:02 netbios-ns UDP datagram from 195.251.9.141
> Nov 16 09:37:16 last message repeated 1 time(s)
>
> il s'agit de supprimer toutes les lignes contenant "192.168.2.", et
> éventuellement celles qui les suivent immédiatement et qui
> contiennent "last message". j'ai beaucoup cherché avec grep, sans
> résultat.
Bon, la difficulté est dans le nombre indéterminé de lignes qui
contient le « last message ». Voici une solution en Perl :
$ cat tri.pl
#!/usr/bin/perl -w
use strict;
my $nextline = "0"; # drapeau conditionnel
my $filename = $ARGV[0]; # fichier d'entrée
open(FILE,$filename) || die "can't open file: $!\n";
while(<FILE>) {
if (/192\.168\.2/) {
++$nextline;
next;
}
elsif ( (/last message/) && (!($nextline eq "0")) ) {
next;
}
elsif (!(/last message/) && ($nextline eq "1")) {
print $_;
$nextline = "0";
}
else {
print $_;
}
}
J'ai essayé avec
Nov 16 09:18:21 port 49006 UDP datagram from 212.21.255.76
Nov 16 09:19:04 last message repeated 4 time(s)
Nov 16 09:19:04 netbios-ns UDP datagram from 192.168.2.23
Nov 16 09:19:12 last message repeated 19 time(s)
Nov 16 09:19:12 last message repeated 19 time(s)
Nov 16 09:19:12 last message repeated 19 time(s)
Nov 16 09:19:12 last message repeated 19 time(s)
Nov 16 09:37:02 netbios-ns UDP datagram from 195.251.9.141
Nov 16 09:37:16 last message repeated 1 time(s)
$ tri.pl essai
Nov 16 09:18:21 port 49006 UDP datagram from 212.21.255.76
Nov 16 09:19:04 last message repeated 4 time(s)
Nov 16 09:37:02 netbios-ns UDP datagram from 195.251.9.141
Nov 16 09:37:16 last message repeated 1 time(s)
et cela fonctionne © ®, au moins chez moi...
Note que c'est très facile à automatiser (en mettant en paramètre les
expressions rationnelles) par la suite.
On doit pouvoir l'écrire sur une ligne de commande mais 1) je ne
maîtrise pas bien Perl en ligne de commande 2) je ne suis pas sûr que
cela très lisible 3) ce n'est pas terrible en terme de
« réutilisabilité¹ »...
PK
¹ : le terme français idoine est ?
--
|\ _,,,---,,_ Patrice KARATCHENTZEFF
ZZZzz /,`.-'`' -. ;-;;,_
mailto:p.karatchentzeff@free.fr
|,4- ) )-,_. ,\ ( `'-'
http://p.karatchentzeff.free.fr
'---''(_/--' `-'\_)