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

Recuperer le dernier element d'une ligne (meme s'il contient des espaces)...

7 réponses
Avatar
gniagnia
Bonjour,

j'ecris un script perl qui scrute un fichier de log contenant des
lignes au format suivant :


2007/02/15 17:59:22 192.168.0.12 ftpuser1 STOR 436699136 /ftp-data/
expl/data/out/region1/ftpuser1/fichier ftp de test.txt
2007/02/15 18:29:22 192.168.0.12 ftpuser1 STOR 436699136 /ftp-data/
expl/data/out/region1/ftpuser1/video.mpg

Je souhaiterai recuperer dans un tableau le nom de fichier a la fin de
chaque ligne :


fichier ftp de test.txt
video.mpg
etc...


Pour l'instant j'ai reussi a faire cela :

foreach $ftpd_line (@ftpd_lines) {
my @tmp=split(/\s+/,$ftpd_line);
my @tmpfile=split(/\//,$tmp[6]);
push(@ftpfilesout,@tmpfile[7..$#tmpfile]);
}


Mais un probleme se pose pour les nom de fichier contenant des
espaces.
En effet, mon tableau de resultat final @ftpfileout ressemble a cela :

fichier
video.mpg
...

Et la je bloque....

Merci d'avance pour votre aide !

7 réponses

Avatar
Jogo
Sur fr.comp.lang.perl, gniagnia disait :

Je souhaiterai recuperer dans un tableau le nom de fichier a la fin de
chaque ligne :

foreach $ftpd_line (@ftpd_lines) {
my @tmp=split(/s+/,$ftpd_line);
my @tmpfile=split(///,$tmp[6]);
push(@ftpfilesout,@tmpfile[7..$#tmpfile]);
}

Mais un probleme se pose pour les nom de fichier contenant des
espaces.


Si tu veux juste le nom du fichier :

foreach $ftpd_line (@ftpd_lines) {
push(@ftpfilesout,$1) if ( $ftp_line =~ m:/([^/]*S)s*$: ) ;
}

Si tu veux tout ce qui suis ftpuser<n> :

foreach $ftpd_line (@ftpd_lines) {
push(@ftpfilesout,$1) if ( $ftp_line =~ m:ftpuserd+/(.*S)s*$: ) ;
}

Si tu veux tout sauf les 6 premiers répertoires :

foreach $ftpd_line (@ftpd_lines) {
push(@ftpfilesout,$1) if ( $ftp_line =~ m:(?:/[^/]*){6}/(.*S)s*$: ) ;
}

Si tu veux mieux comprendre tout ça :

http://perl.enstimac.fr/DocFr/perlretut.html

--
Skill without imagination is craftsmanship and gives us many useful
objects such as wickerwork picnic baskets. Imagination without skill
gives us modern art.
-- Tom Stoppard

Avatar
Benoit Izac
Bonjour,

le 16/02/2007 à 10:24, "gniagnia" a écrit dans le
message :

j'ecris un script perl qui scrute un fichier de log contenant des
lignes au format suivant :


2007/02/15 17:59:22 192.168.0.12 ftpuser1 STOR 436699136 /ftp-data/
expl/data/out/region1/ftpuser1/fichier ftp de test.txt
2007/02/15 18:29:22 192.168.0.12 ftpuser1 STOR 436699136 /ftp-data/
expl/data/out/region1/ftpuser1/video.mpg

Je souhaiterai recuperer dans un tableau le nom de fichier a la fin de
chaque ligne :


fichier ftp de test.txt
video.mpg
etc...


Pour l'instant j'ai reussi a faire cela :

foreach $ftpd_line (@ftpd_lines) {
my @tmp=split(/s+/,$ftpd_line);
my @tmpfile=split(///,$tmp[6]);
push(@ftpfilesout,@tmpfile[7..$#tmpfile]);
}


Mais un probleme se pose pour les nom de fichier contenant des
espaces.
En effet, mon tableau de resultat final @ftpfileout ressemble a cela :

fichier
video.mpg
...


foreach (@ftpd_lines) {
chomp;
push(@ftpfilesout, $1) if (m:([^/]+$):);
}

--
Benoit Izac

Avatar
gniagnia
On 16 fév, 12:01, Benoit Izac wrote:
Bonjour,

le 16/02/2007 à 10:24, "gniagnia" a écrit dans le
message :





j'ecris un script perl qui scrute un fichier de log contenant des
lignes au format suivant :

2007/02/15 17:59:22 192.168.0.12 ftpuser1 STOR 436699136 /ftp-data/
expl/data/out/region1/ftpuser1/fichier ftp de test.txt
2007/02/15 18:29:22 192.168.0.12 ftpuser1 STOR 436699136 /ftp-data/
expl/data/out/region1/ftpuser1/video.mpg

Je souhaiterai recuperer dans un tableau le nom de fichier a la fin de
chaque ligne :

fichier ftp de test.txt
video.mpg
etc...

Pour l'instant j'ai reussi a faire cela :

foreach $ftpd_line (@ftpd_lines) {
my @tmp=split(/s+/,$ftpd_line);
my @tmpfile=split(///,$tmp[6]);
push(@ftpfilesout,@tmpfile[7..$#tmpfile]);
}

Mais un probleme se pose pour les nom de fichier contenant des
espaces.
En effet, mon tableau de resultat final @ftpfileout ressemble a cela :

fichier
video.mpg
...


foreach (@ftpd_lines) {
chomp;
push(@ftpfilesout, $1) if (m:([^/]+$):);

}

--
Benoit Izac- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Pourriez vous m'expliquer ce que fait ce script exactement ?
Merci encore


Avatar
gniagnia
On 16 fév, 11:59, Jogo wrote:
Sur fr.comp.lang.perl, gniagnia disait :

Je souhaiterai recuperer dans un tableau le nom de fichier a la fin de
chaque ligne :

foreach $ftpd_line (@ftpd_lines) {
my @tmp=split(/s+/,$ftpd_line);
my @tmpfile=split(///,$tmp[6]);
push(@ftpfilesout,@tmpfile[7..$#tmpfile]);
}

Mais un probleme se pose pour les nom de fichier contenant des
espaces.


Si tu veux juste le nom du fichier :

foreach $ftpd_line (@ftpd_lines) {
push(@ftpfilesout,$1) if ( $ftp_line =~ m:/([^/]*S)s*$: ) ;

}

Si tu veux tout ce qui suis ftpuser<n> :

foreach $ftpd_line (@ftpd_lines) {
push(@ftpfilesout,$1) if ( $ftp_line =~ m:ftpuserd+/(.*S)s*$: ) ;

}

Si tu veux tout sauf les 6 premiers répertoires :

foreach $ftpd_line (@ftpd_lines) {
push(@ftpfilesout,$1) if ( $ftp_line =~ m:(?:/[^/]*){6}/(.*S)s*$: ) ;

}

Si tu veux mieux comprendre tout ça :

http://perl.enstimac.fr/DocFr/perlretut.html

--
Skill without imagination is craftsmanship and gives us many useful
objects such as wickerwork picnic baskets. Imagination without skill
gives us modern art.
-- Tom Stoppard


MERCI !


Avatar
Benoit Izac
Bonjour,

le 16/02/2007 à 12:26, "gniagnia" a écrit dans le
message :

foreach (@ftpd_lines) {
chomp;
push(@ftpfilesout, $1) if (m:([^/]+$):);
}


Pourriez vous m'expliquer ce que fait ce script exactement ?


Pour toutes les valeurs successives du tableau @ftp_lines, on affecte la
valeur en cours à la variable spéciale « $_ ».

chomp retire la fin de ligne si elle est présente dans la variable $_.

Si la variable $_ contient un ou plusieurs caractères différents de
« / » avant la fin de la chaîne, on les affecte à la variable $1 (grâce
aux parenthèses) et on ajoute cette suite de caractère au tableau
@ftpfilesout.

perldoc perlre

--
Benoit Izac


Avatar
gniagnia
Merci beaucoup pour cette explication.

Je commance a me familiariser avec les expressions regulieres....mais
j'ai encore un petit pb :

Le fichier de log que je traite peux parfois contenir les lignes
suivantes :


2007/02/15 17:46:31 192.168.0.12 ftpuser1 RETR - -


....C'est a dier une ligne qui ne contient pas de nom de fichier.....
Dans ce cas, le script perl fait logiquement ce qui lui est demandé et
alimente @ftpfilesout avec la valeur suivante :

15 17:46:31 192.168.0.12 ftpuser1 RETR - -


Comment faire pour que le script perl, bypass ce genre de ligne ?

Encore merci!
Avatar
Benoit Izac
Bonjour,

le 19/02/2007 à 10:17, "gniagnia" a écrit dans le
message :

Le fichier de log que je traite peux parfois contenir les lignes
suivantes :

2007/02/15 17:46:31 192.168.0.12 ftpuser1 RETR - -


....C'est a dier une ligne qui ne contient pas de nom de fichier.....
Dans ce cas, le script perl fait logiquement ce qui lui est demandé et
alimente @ftpfilesout avec la valeur suivante :

15 17:46:31 192.168.0.12 ftpuser1 RETR - -

Comment faire pour que le script perl, bypass ce genre de ligne ?


Il faudrait connaître exactement les différentes sorties possibles dans
les log pour écrire une telle expression. Si comme tu l'as écrit
précédemment il y a toujours « STOR », tu peux faire :

push(@ftpfilesout, $1) if (m:bSTORb.*?([^/]+$):);

Je te laisse le soin de lire la documentation (qui existe aussi en
français : <http://perl.enstimac.fr/>) pour comprendre cette expression
et l'adapter à tes besoins réels.

--
Benoit Izac