Perl : inclusion de awk

[Résolu/Fermé]
Signaler
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
-
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
-
Bonjour,

Je veux ecrire un script Perl qui liste les fichiers contenus dans un repertoire avec seulement trois champs. Mais ca ne fonctionne pas.

Si j'execute le script suivant, ca fonctionne (il liste tous les champs):

Script 1:

#!/usr/bin/perl
my $rep = "/media/sda5/Informatique/Test/Test_1";
chdir $rep;
my @ls = qx{ls -l $rep};
print "@ls\n";


-------------------------------------------------------------------------------------

Si je rajoute la commande awk, il y a une erreur qui apparait.

Script 2 :

#!/usr/bin/perl
my $rep = "/media/sda5/Informatique/Test/Test_1";
chdir $rep;
my @ls = qx{ls -l $rep | awk '{ print $5,$6,$8 }'};
print "@ls\n";


Resultat :

awk: line 1: syntax error at or near ,

Ou est le probleme?

Merci

14 réponses

Messages postés
18246
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
21 juillet 2021
5 331
les variables awk sont prises pour des variables perl, et comme ça ? my @ls = qx{ls -l $rep | awk '{ print \$5,\$6,\$8 }'};
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
Merci dubcek, je vais essayer cela dans les prochains jours. Trop occupé pour le moment... et pas chez-moi! Je t'en redonne des nouvelles.
Merci. :-)
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Salut,

pourquoi pas en Perl (vous que tu veux apprendre ;-)

lami20j@debserv:~/trash$ cat artagon.pl
#!/usr/bin/perl
use strict;use warnings;

my $rep="/home/lami20j/trash/c_exercices";
opendir REP,"c_exercices"
    or die "E/S :$!\n";

while(my $fic = readdir(REP)){
  next if $fic=~/^\.\.?$/;
  my @stat = (stat("$rep/$fic"))[7,9];
  my ($j,$m,$a) = (localtime($stat[1]))[3..5];
  printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
}
__END__
lami20j@debserv:~/trash$ perl artagon.pl
4096 2008-02-10 3
543 2008-02-10 functions_date.c
lami20j@debserv:~/trash$
et voici le résultat de la commande awk
lami20j@debserv:~/trash$ ls -l  c_exercices/| awk '{ print $5,$6,$8 }'

4096 2008-02-10 3
543 2008-02-10 functions_date.c

Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
Bonjour,

Finalement, je peux vous repondre ...trois jours apres. Excusez-moi du retard.

Premierement, dubcek ta commande marche tres bien.

Quant a toi, lami20j, tu as monte le degre de difficulte d'une coche (plutot de deux ... :-) ). Cependant, dans mon cas ca n'a pas fonctionne. Je n'ai change que le repertoire. Voici le fichier :

/Perl$ cat lami20j_3_champs.pl
#!/usr/bin/perl
use strict;use warnings;

my $rep="/media/sda5/Informatique/Test/Test_1";
opendir REP,"Test_1"
or die "E/S :$!\n";

while(my $fic = readdir(REP)){
next if $fic=~/^\.\.?$/;
my @stat = (stat("$rep/$fic"))[7,9];
my ($j,$m,$a) = (localtime($stat[1]))[3..5];
printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
}
__END__


et le resultat :

/Perl$ perl lami20j_3_champs.pl
E/S :No such file or directory


Le repertoire /media/sda5/Informatique/Test/Test_1 existe bel et bien.

Il va falloir que j'y aille bientot. Encore une fois...

Eh lami20j, est-ce que tu connais un operateur dans Perl qui allonge les journees de 6 heures. Je pourrais les consacrer a Perl ...

Merci a vous deux,
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Salut,

Le repertoire /media/sda5/Informatique/Test/Test_1 existe bel et bien.
je n'ai pas dit le contraire ;-)

essaie
#!/usr/bin/perl
use strict;use warnings;

my $rep="/media/sda5/Informatique/Test";
opendir REP,"Test_1"
or die "E/S :$!\n";

while(my $fic = readdir(REP)){
next if $fic=~/^\.\.?$/;
my @stat = (stat("$rep/$fic"))[7,9];
my ($j,$m,$a) = (localtime($stat[1]))[3..5];
printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
}
__END__ 
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
qui allonge les journees de 6 heures

je ne comprends pas ta question
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
Non lami20j. ca ne fonctionne pas non plus.

A propos del'operateur : les journees ont 24 heures. Est-ce que tu connais un operateur de Perl qui les allongeraient jusqu'a 30 heures... il ne faut pas me prendre toujours au serieux ... ;-)

Je dois quitter pour aller travailler.

Je vais regarder ta reponse demain si possible

Salut et merci,
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
alors affiche le résultat de

#!/usr/bin/perl
use strict;use warnings;

my $rep="/media/sda5/Informatique/Test";
opendir REP,"Test_1"
or die "E/S :$!\n";

while(my $fic = readdir(REP)){
  next if $fic=~/^\.\.?$/;
  print "$rep/$fic\n";
  #my @stat = (stat("$rep/$fic"))[7,9];
  #my ($j,$m,$a) = (localtime($stat[1]))[3..5];
  #printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
}
__END__ 
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
Salut lami20j,

J'ai essaye ton script soit :

#!/usr/bin/perl
use strict;use warnings;
my $rep="/media/sda5/Informatique/Test";
opendir REP,"Test_1"
or die "E/S :$!\n";
while(my $fic = readdir(REP)){
next if $fic=~/^\.\.?$/;
print "$rep/$fic\n";
}
__END__


et ca donne toujours le meme resultat, soit E/S :No such file or directory.

J'ai observe que le mot REP apparait en noir ordinaire. Habituellement, Kate colorie les caracteres qui font partie d'un mot cle ou d'une variable. Par exemple, dans ton script print est en bleu, my en noir fonce, or en vert, $rep en brun. Ce n'est pas le cas ici. En principe, ca devrait ...

Donc, je crois que Perl ne reconnait pas REP. Est-ce que REP est-un mot cle du langage ou une variable? Tu as defini $rep et non $REP.

Merci, Aujourd'hui, j'ai finalement du temps ... :-)
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Salut,

essaie
#!/usr/bin/perl
use strict;use warnings;
my $rep="/media/sda5/Informatique/Test";
opendir REP,"Test"
or die "E/S :$!\n";
while(my $fic = readdir(REP)){
next if $fic=~/^\.\.?$/;
print "$rep/$fic\n";
}
__END__ 


REP et $rep ne se réfère pas à la même chose ;-)
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
Toujours la meme chose ...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
affiche
ls -l /media/sda5/Informatique/Test
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
en fait je pense qu'à l'exécution de script tu n'est pas dans
/media/sda5/Informatique/Test

donc essaie
#!/usr/bin/perl
use strict;use warnings;
my $rep="/media/sda5/Informatique/Test";
opendir REP,"$rep"
  or die "E/S :$!\n";

while(my $fic = readdir(REP)){
  next if $fic=~/^\.\.?$/;
  print "$rep/$fic\n";
}
__END__ 
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
Cela a fonctionne cette fois-ci. Effectivement, je mets mes scripts dans un seul repertoire. Je ne veux pas les eparpiller un peu partout. En principe, ca devrait etre la bonne facon de proceder mais j'aurais du le specifier avant ...

Merci lami20j,