Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Equivalent de grep, mais multilignes

7 réponses
Avatar
Kevin Denis
Bonjour,

est-ce qu'il existe un équivalent de grep multilignes?

Grep permet de trouver des motifs dans un fichiers.

J'ai plusieurs motifs à chercher dans un grand nombre de fichiers,
chaque motif faisant entre 5 et 20 lignes.

C'est à dire que j'ai un fichier:

ligne
ligne
autre ligne
123
ligne

Et je souhaite savoir si ce fichier comporte le motif

123
ligne

Bien entendu le fichier suivant ne doit pas correspondre:

ligne
123
autre ligne
ligne

(linux + bash)

Merci
--
Kevin

7 réponses

Avatar
Stephane CHAZELAS
2009-05-25, 13:20(+00), Kevin Denis:
Bonjour,

est-ce qu'il existe un équivalent de grep multilignes?

Grep permet de trouver des motifs dans un fichiers.

J'ai plusieurs motifs à chercher dans un grand nombre de fichiers,
chaque motif faisant entre 5 et 20 lignes.

C'est à dire que j'ai un fichier:

ligne
ligne
autre ligne
123
ligne

Et je souhaite savoir si ce fichier comporte le motif

123
ligne

Bien entendu le fichier suivant ne doit pas correspondre:

ligne
123
autre ligne
ligne

(linux + bash)


[...]

perl -l -0777 -ne 'print $ARGV if /123nligne/' fichier1 fichier2...

gawk -vRS='[^-377]' '/123nligne/{print FILENAME}'

--
Stéphane
Avatar
Kevin Denis
Le 25-05-2009, Stephane CHAZELAS a écrit :
est-ce qu'il existe un équivalent de grep multilignes?
Grep permet de trouver des motifs dans un fichiers.
J'ai plusieurs motifs à chercher dans un grand nombre de fichiers,
chaque motif faisant entre 5 et 20 lignes.

(linux + bash)


[...]

perl -l -0777 -ne 'print $ARGV if /123nligne/' fichier1 fichier2...



Je vais laisser perl de côté.

gawk -vRS='[^-377]' '/123nligne/{print FILENAME}'



J'ai du mal à comprendre. On affecte à RS la valeur [^-377]. RS
doit signifier Record Separator (je pense?).
Le fait d'affecter une valeur à RS permet d'indiquer comment les
enregistrements sont séparés. Et là, j'ai du mal à saisir
ce que signifie la valeur... (en tout cas, sans celle-ci, cela
ne fonctionne pas).
--
Kevin
Avatar
Jacques L'helgoualc'h
Le 25-05-2009, Kevin Denis a écrit :
Bonjour,



bonjour,

est-ce qu'il existe un équivalent de grep multilignes?

[...] je souhaite savoir si ce fichier comporte le motif

123
ligne



Quelque chose comme ça ?

sed -ne '/123/!d;N;/123.*nligne/p;D'

--
Jacques L'helgoualc'h
Avatar
Benoit Izac
Bonjour,

le 27/05/2009 à 17:07, Kevin Denis a écrit dans le message
:

gawk -vRS='[^-377]' '/123nligne/{print FILENAME}'



J'ai du mal à comprendre. On affecte à RS la valeur [^-377]. RS
doit signifier Record Separator (je pense?).
Le fait d'affecter une valeur à RS permet d'indiquer comment les
enregistrements sont séparés. Et là, j'ai du mal à saisir
ce que signifie la valeur... (en tout cas, sans celle-ci, cela
ne fonctionne pas).



Cela signifie que l'on va prendre comme séparateur de champ un caractère
qui n'appartient pas à la fourchette 0 - 377 (en octal). En clair, aucun
caractère. Par conséquence, awk va lire tout le fichier d'un coup et ne
verra qu'une ligne dans laquelle il recherchera le motif.

--
Benoit Izac
Avatar
Benoit Izac
Bonjour,

le 27/05/2009 à 17:07, Kevin Denis a écrit dans le message
:

gawk -vRS='[^-377]' '/123nligne/{print FILENAME}'



J'ai du mal à comprendre. On affecte à RS la valeur [^-377]. RS
doit signifier Record Separator (je pense?).
Le fait d'affecter une valeur à RS permet d'indiquer comment les
enregistrements sont séparés. Et là, j'ai du mal à saisir
ce que signifie la valeur... (en tout cas, sans celle-ci, cela
ne fonctionne pas).



Cela signifie que l'on va prendre comme séparateur de champ un caractère
qui n'appartient pas à la fourchette 0 - 377 (en octal). En clair, aucun
caractère. Par conséquence, awk va lire tout le fichier d'un coup et ne
verra qu'un champ dans lequel il recherchera le motif.

--
Benoit Izac
Avatar
Cyrille Lefevre
Benoit Izac a écrit :
Bonjour,

le 27/05/2009 à 17:07, Kevin Denis a écrit dans le message
:

gawk -vRS='[^-377]' '/123nligne/{print FILENAME}'



J'ai du mal à comprendre. On affecte à RS la valeur [^-37 7]. RS
doit signifier Record Separator (je pense?).
Le fait d'affecter une valeur à RS permet d'indiquer comment les
enregistrements sont séparés. Et là, j'ai du mal à saisir
ce que signifie la valeur... (en tout cas, sans celle-ci, cela
ne fonctionne pas).



Cela signifie que l'on va prendre comme séparateur de champ un car actère
qui n'appartient pas à la fourchette 0 - 377 (en octal). En clair, aucun
caractère. Par conséquence, awk va lire tout le fichier d'un coup et ne
verra qu'un champ dans lequel il recherchera le motif.




Bonjour,

suis pas sur que ça marche avec autre chose que gnu awk, d'ailleurs :

http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html

INPUT FILES

Whether the variable RS is set to a value other than a <newline> or not,
for these files, implementations shall support records terminated with
the specified separator up to {LINE_MAX} bytes and may support longer
records.

note le LINE_MAX bytes...

autrement dit, cela marche tant que la taille du fichier est < à
LINE_MAX, sinon, peut-être, mais sans certitude...

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Stephane CHAZELAS
2009-05-27, 22:13(+02), Cyrille Lefevre:
Benoit Izac a écrit :
Bonjour,

le 27/05/2009 à 17:07, Kevin Denis a écrit dans le message
:

gawk -vRS='[^-377]' '/123nligne/{print FILENAME}'



J'ai du mal à comprendre. On affecte à RS la valeur [^-377]. RS
doit signifier Record Separator (je pense?).
Le fait d'affecter une valeur à RS permet d'indiquer comment les
enregistrements sont séparés. Et là, j'ai du mal à saisir
ce que signifie la valeur... (en tout cas, sans celle-ci, cela
ne fonctionne pas).



Cela signifie que l'on va prendre comme séparateur de champ un caractère
qui n'appartient pas à la fourchette 0 - 377 (en octal). En clair, aucun
caractère. Par conséquence, awk va lire tout le fichier d'un coup et ne
verra qu'un champ dans lequel il recherchera le motif.




Bonjour,

suis pas sur que ça marche avec autre chose que gnu awk, d'ailleurs :


[...]

Oui, c'est d'ailleurs pour ca que j'ai ecrit "gawk" et pas
"awk". La possibilité d'avoir une regexp pour RS est aussi une
extension GNU.

--
Stéphane