[PERL]- traduire du shell en perl

tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -  
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Avis aux habitués!!
je suis en train de me mordre les doigts sur une traduction d'un programme en perl:

cat $Conf_file | while read line
do
cat $File.sort | grep -v -w "$line" > $File.tmp
cat $File.tmp > $File.sort
done
cat $File.sort | sort >> $File.focal

Merci de tout coeur!!!
A voir également:

90 réponses

tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
il ne laiise que
TEST: test
pooop: test alors qu'il manque plein de lignes comme:

dhcpd: allo
dhcpd: coucou
....
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
il ne repère pas les phrases exactes. pour peu que le fichier.analyse contient juste un lmot de .conf , il l'enleve
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
j'avoue que je ne comprends pas ce que tu veux
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
Voici un exemple concret:

Fichier.analyse:


patate: chou
dhcpd: coucou lami20j
dhcpd: exiting
dhcpd: serveur is now je sais quoi

Fichier.conf:

dhcpd: exiting
dhcpd: serveur | quoi

On veut en sortie sur le
.focal
:
patate:chou
dhcpd: coucou lamij20


alors que a présent vu que toutes les lignes commencent par dhcpd, cela est mal interprété et on obtient only:
patate:chou

voila le probleme
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
j'espere que cet exemple t'aidera a comprendre ce fichu probleme!
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
ou sinon on pourrais scinder chaque mot d'une ligne qu'on cherche a tester et on teste si ces mots sont TOUS dans
la ligne du fichier .conf. Ex:

.analyse: dhcpd: coucou lami20j
"dhcpd" ":" "coucou" "lami20j"

.conf
dhcpd: exciting
"dhcpd" "exiting"

on teste si tout les mots de .analyse sont dans .conf et si non (ici c'est le cas) , on met cette ligne de .analyse dans .focal!!!

.analyse
dhcpd: coucou lami20j

qu'en pense tu?
0
le doc
 
#!/usr/bin/perl

open (A, "< conf.txt");
my @conf = <A>;

open (B, "< sort.txt");
my @sort = <B>;

$match = 0;
foreach $c (@conf) {
foreach $f (@sort) {
if ($f =~ /$c/) {
$match = 1 ;
}
}
if (not $match) {
push(@sort,$c);
}
}
my @focal = sort @sort ;
open C, "+> focal.txt" or die "Can not open file for output!\n";
foreach $line ( @focal) {
print C ( $line );
}
close C;
print Dumper(@focal);
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

la façon dont tu as écrit le code, peut être traduit de la façon suivante :
cherche les éléments de @conf qui ne sont pas en @sort

le problème c'est qu'un élément de conf n'est pas une sous chaîne d'un élement de sort
mais qu'une partie d'un élement de conf peut être une partie d'un élement de sort (à moins que j'ai mal compris depuis le début)

donc au lieu de faire un foreach imbriquer, une version idiomatique et plus rapide sera

my %vu_dans_sort;
my @que_dans_conf;

@vu_dans_sort{@sort}=();

foreach(@conf){
  push (@que_dans_conf,$_) unless exists $vu_dans_sort{$_};
}
push @sort,@que_dans_conf;

0
le doc
 
Autant pour moi, j'avais posté un peu vite sans garder la mise en forme.
J'espère que cela repondra au problème, mais je ne suis pas sur de bien l'avoir compris.
Au moins cela te donne quelques éléments de base : récupération d'un fichier dans un array, comparaison de deux arrays et ecriture d'un array dans un fichier.

#!/usr/bin/perl

open (A, "< conf.txt");
my @conf = <A>;

open (B, "< sort.txt");
my @sort = <B>;

$match = 0;
foreach $c (@conf) {
  foreach $f (@sort) {
    if ($f =~ /$c/) {
       $match = 1 ;
    }
  }
  if (not $match) {
     push(@sort,$c);
  }
}
my @focal = sort @sort ;
open C, "+> focal.txt" or die "Can not open file for output!\n";
foreach $line ( @focal) {
    print C ( $line ); 
}
close C;
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

mais je ne suis pas sur de bien l'avoir compris.

A vrai dire, de mon côté je n'ai pas compris ;-((

Si on a 2 tableux et les éléments d'un tableau sont des sous-chaînes pour les éléments du 2ème tableau, c'est simple
Mais à priori, ce n'est pas ça.
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
Bonjour,

Si on a 2 tableux et les éléments d'un tableau sont des sous-chaînes pour les éléments du 2ème tableau, c'est simple

Oui c'est ca mais il faut qu'un element du tableau (.conf) soit exactement mot pour mot ( cad qu'il faut que tous les mots d'une ligne sans exception) une partie d'un element du 2eme tableau (.analyse) et o,n met la ligne en question de .analsyse dans un .tmp
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

on n'est toujours pas sur la même longueur d'onde

d'après ce que tu viens de dire dans ton dernière message, alors la solution je te l'ai déjà donné depuis longtemps

en revanche si on regarde tes fichiers, ce n'est pas ce que tu demandes

prenons par exemple la ligne

fichier.analyse
Apr 11 16:32:49 vmonitor Server Administrator: Storage Service EventID: 2243 The Patrol Read has stopped.:
Controller 0 (PERC 5/i Integrated)

fichier.conf
Server Administrator: Storage Service| Time established as

tu veux faire la comparaion entre

voir en gras

Apr 11 16:32:49 vmonitor Server Administrator: Storage Service EventID: 2243 The Patrol Read has stopped.:
Controller 0 (PERC 5/i Integrated)

et

Server Administrator: Storage Service| Time established as

Le problème ce que c'est juste un exemple
SI on prends la totalité des fichiers, il n'y a pas une règle qui permettra de savoir ce qu'on doit comparer

Voic un exemple très basique qui teste la ligne entière (pour adapter à ta situation il faut savoir ce qu'on veut comparer, et ça avec précision sinon les résultat serront sûrement aberrantes)
lami20j@debian:~/trash$ cat comp.pl
#!/usr/bin/perl
use strict;use warnings;

open CONF,"fichier.conf"
   or die "fichier.conf E/S : $!\n";
open ANALYSE,"fichier.analyse"
   or die "fichier.analyse E/S : $!\n";
open TMP,">fichier.tmp"
   or die "fichier.tmp E/S : $!\n";

my @conf=<CONF>;
my @analyse=<ANALYSE>;

my (@que_dans_conf,%dans_analyse);

@dans_analyse{@analyse}=();

foreach(@conf){
  push @que_dans_conf,$_ unless exists $dans_analyse{$_};
}
print TMP for @que_dans_conf;
__END__
lami20j@debian:~/trash$ cat fichier.conf
ligne que dans conf
n'importe quoi
lami20j@debian:~/trash$ cat fichier.analyse
que dans archive
n'importe quoi
lami20j@debian:~/trash$ perl comp.pl
lami20j@debian:~/trash$ cat fichier.tmp
ligne que dans conf
lami20j@debian:~/trash$




0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
Apr 11 16:32:49 vmonitor Server Administrator: Storage Service EventID: 2243 The Patrol Read has stopped.:
Controller 0 (PERC 5/i Integrated)

et

Server Administrator: Storage Service| Time established a


Compare plutot:
Apr 11 16:32:49 vmonitor Server Administrator: Storage Service EventID: 2243 The Patrol Read has stopped.:
Controller 0 (PERC 5/i Integrated)
Apr 11 16:32:49 vmonitor Server Administrator: Storage rvrvrvrrv encvrbnvnrnvnrv

à .conf:

Server Administrator: Storage Service

en sortie il faudrait dans .tmp:
Apr 11 16:32:49 vmonitor Server Administrator: Storage rvrvrvrrv encvrbnvnrnvnrv
car celel ci ne contient pas mot pour mot (seulement une partie) du fichier.conf

Avec ton script cela enlevait tout meme ceux qui n'en contenait une partie et pas la phrase entière
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
mais je compare quoi????

peut être dans ta tête c'est clair, mais pas dans la mienne :-((

d'après ce que je comprends
dans ce cas la chaîne de comparaison est Server Administrator: Storage Service

Ma question est :
comment on peut trouver chaque chaîne de comparaison dans ton fichier .conf?

vu que dès fois elle est
Server Administrator: Storage Service djklfsd lkjsdlfk dskljlksd fjlksdj
et des fois elle est
Server Administrator: Instrumentation Service gjlkdsjgfl jkljlkjlk
et des fois elle est

..............je ne sait pas quoi encoire................

Si tu me fait comprendre ça ton problème n'est pas du tout difficile.
Je me casse la tête pas pour le script, mais pour comprendre ce que tu veux.
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
moi je te montre des exemples.
bref c'est dur a expliquer.
je veux comparer chaque ligne du .conf et chaque ligne du .analyse
Mon .conf est constitué de toutes les chaines qu'il ne faut pas trouver dans mon .analyse , c'est pour sa que je test chaque ligne de ce fichier

.conf
Expression 1
Expression 2
Expression 3


.analyse
Expression 1
Expression 2
Expressionnnn3
Expression 4

Je garde:
Expressionnnn3
Expression 4
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Oui, mais ce cas est simple, et mon script fonctionne très bien
lami20j@debian:~/trash$ cat compfic.pl
#!/usr/bin/perl
use strict;use warnings;

open CONF,"fichier.conf"
   or die "E/S : $!\n";
open ANALYSE,"fichier.analyse"
   or die "E/S : $!\n";
open TMP,">fichier.tmp"
   or die "E/S : $!\n";

my @conf=<CONF>;
chomp @conf;
while(my $e=<ANALYSE>){
        chomp($e);
        print TMP $e,"\n" unless grep { $e=~/$_/ } @conf;
}
__END__

lami20j@debian:~/trash$ cat fichier.conf
Expression 1
Expression 2
Expression 3
lami20j@debian:~/trash$ cat fichier.analyse
Expression 1
Expression 2
Expressionnnn3
Expression 4
lami20j@debian:~/trash$ perl compfic.pl
lami20j@debian:~/trash$ cat fichier.tmp
Expressionnnn3
Expression 4

Le problème n'est pas là.
Le problème est que je ne sais pas comment sont construite tes expressions
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
et test pour ton script:

.analyse:
dhcpd: exiting
dhcpd: lamij20

.conf
dhcpd: exiting

si je té envoyer par mail les expressions.
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
si je té envoyer par mail les expressions.

justement, je ne comprends rien, depuis tes expression je dois prendre seulement une partie
et c'est ça que tu ne veux pas comprendre, que s'il n'y a pas une règle pour l'extraire ton problème devient impossible de l'automatiser
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
la regle est de tester si la ligne de.analyse contient une ligne du .conf en entier
essaie cela tu va comprendre:

et test pour ton script:

.analyse:
dhcpd: exiting
dhcpd: lamij20

.conf
dhcpd: exiting

di moi ce que tu obtient
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
dans ton .conf
tu as

Server Administrator: Instrumentation Service Server Administrator startup complete
Server Administrator: Storage Service Battery charge complete

dit moi?
quelle règle de séparation je dois utiliser pour savoir que je dois utilser la partie en gras pour comparaison?
c'est ça que je ne comprends pas
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
je prend pour ex une ligne de .conf et un ligne de .analyse. il faudra repeter cette opé pour chaque ligne de .conf et .analyse:

*scinder la ligne de .conf en plusieurs mots
* tester si chacun de ces mots apartiennent TOUS sans exception a la ligne .analyse

*si oui la ligne .analyse est rejetée
*si non la ligne .analyse est mise dans tmp
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
regarde ce que j'obtiens
lami20j@debian:~/trash$ cat fichier.conf
dhcpd: exiting
lami20j@debian:~/trash$ cat fichier.analyse
dhcpd: exiting
dhcpd: lamij20
lami20j@debian:~/trash$ perl compfic.pl
lami20j@debian:~/trash$ cat fichier.tmp
dhcpd: lamij20

0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
ba c'est cela que je veux alors qu'hier avec celui que tu mavai montré cela ne marchait pas.
tu a utilisé quel script??????
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 

*scinder la ligne de .conf en plusieurs mots
* tester si chacun de ces mots apartiennent TOUS sans exception a la ligne .analyse

pas besoin
ça c'est équivalent qu'un chaine est la sous chaîne de la chaîne principale

*si oui la ligne .analyse est rejetée
*si non la ligne .analyse est mise dans tmp
</ital>
c'est exactement ça que j'ai fait mon script

0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
ça c'est équivalent qu'un chaine est la sous chaîne de la chaîne principale
voila c'est exactement sa!
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention  
 
et on vient à la case départ

d'après quelle règle j'établi la sous chaîne pour pouvoir faire la comparaison?
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
regarde ce que j'obtiens
tu a utilisé quel script?

le fichier .conf represente pour chaque ligne:
une SOUS CHAINE pour pouvoir faire la comparaison, il n'a pas besoin de la fabriquer, juste de la lire dans ce fichier
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
il n'a pas besoin de la fabriquer,

alors tu peux m'expliquer comment tu sais que pour

Server Administrator: Instrumentation Service Server Administrator startup complete

tu compare seulement Server Administrator: Instrumentation Service

et pour

Server Administrator: Storage Service Battery charge complete

tu compares seulement Server Administrator: Storage Service

??

Comment tu sais quelle sous chaîne?

0