Re: Regexp multiline

Page principale

Répondre à ce message
Auteur: Raphaël Jamet
Date:  
À: guilde
Sujet: Re: Regexp multiline
On 13/03/2012 12:57, Dominique Fournier wrote:
> Bonjour,
>
> Je me bagarre avec une regexp multiline qui me résiste. Un gourou perl
> aurait-il la solution ?
>
> Je parcours des logs de fichiers par un programme et je souhaite
> supprimer la ligne contenant une chaine PLUS la ligne suivante.
> Exemple : le log contient :
> Mar 13 00:05:16 pfsense1 pf: 00:00:00.000133 rule 122/0(match): block
> in on em0: (tos 0x0, ttl 102, id 256, offset 0, flags [none], proto
> TCP (6), length 40)
> Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 >
> 147.173.21.253.1433: Flags [S], cksum 0x3cd3 (correct), seq 294715392,
> win 16384, length 0
> Mar 13 00:05:16 pfsense1 pf: 00:00:00.000021 rule 25/0(match): pass
> out on em2_vlan22: (tos 0x0, ttl 101, id 256, offset 0, flags [none],
> proto TCP (6), length 40)
> Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 >
> 147.173.21.206.1433: Flags [S], cksum 0xff73 (correct), seq
> 1327431680, win 16384, length 0
> Mar 13 00:05:16 pfsense1 pf: 00:00:00.000011 rule 25/0(match): pass
> out on em2_vlan22: (tos 0x0, ttl 101, id 256, offset 0, flags [none],
> proto TCP (6), length 40)
> Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 >
> 147.173.21.182.1433: Flags [S], cksum 0xd920 (correct), seq
> 1971978240, win 16384, length 0

>
> Je veux supprimer les lignes contenant "(match): pass " et la ligne
> suivante du match.
> Evidement, on garde précieusement les autres lignes...
>
> J'ai essayé des trucs comme :
> preg_grep ('#^pf: .+\(match\): pass (out|in) on (\n|.)+^pf:.+$#sm',
> $logs, PREG_GREP_INVERT);
> Mais cela ne matche pas.
>
> Je suis en PHP, mais c'est un problème de regexp.
>
> Avez-vous des idées ?
>
> Merci
>
> Dom
>

On 13/03/2012 12:57, Dominique Fournier wrote:
> Bonjour,
>
> Je me bagarre avec une regexp multiline qui me résiste. Un gourou perl
> aurait-il la solution ?
>
> Je parcours des logs de fichiers par un programme et je souhaite
> supprimer la ligne contenant une chaine PLUS la ligne suivante.
> Exemple : le log contient :
> Mar 13 00:05:16 pfsense1 pf: 00:00:00.000133 rule 122/0(match): block
> in on em0: (tos 0x0, ttl 102, id 256, offset 0, flags [none], proto
> TCP (6), length 40)
> Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 >
> 147.173.21.253.1433: Flags [S], cksum 0x3cd3 (correct), seq 294715392,
> win 16384, length 0
> Mar 13 00:05:16 pfsense1 pf: 00:00:00.000021 rule 25/0(match): pass
> out on em2_vlan22: (tos 0x0, ttl 101, id 256, offset 0, flags [none],
> proto TCP (6), length 40)
> Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 >
> 147.173.21.206.1433: Flags [S], cksum 0xff73 (correct), seq
> 1327431680, win 16384, length 0
> Mar 13 00:05:16 pfsense1 pf: 00:00:00.000011 rule 25/0(match): pass
> out on em2_vlan22: (tos 0x0, ttl 101, id 256, offset 0, flags [none],
> proto TCP (6), length 40)
> Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 >
> 147.173.21.182.1433: Flags [S], cksum 0xd920 (correct), seq
> 1971978240, win 16384, length 0

>
> Je veux supprimer les lignes contenant "(match): pass " et la ligne
> suivante du match.
> Evidement, on garde précieusement les autres lignes...
>
> J'ai essayé des trucs comme :
> preg_grep ('#^pf: .+\(match\): pass (out|in) on (\n|.)+^pf:.+$#sm',
> $logs, PREG_GREP_INVERT);
> Mais cela ne matche pas.
>
> Je suis en PHP, mais c'est un problème de regexp.
>
> Avez-vous des idées ?
>
> Merci
>
> Dom
>

Bonjour,

Je connais pas tellement le multiligne, mais les "^pf" me semblent
curieux : dans l'exemple, tu n'as aucune ligne commençant par "pf". Peut
être plutôt '#^.+pf' au début, et idem pour la seconde ligne (
"(\n|.)+^pf:.+$" -> ".+\n.+pf:.+$") ?

Raphaël