[PERL] commande pour un débutant

Résolu/Fermé
floxi Messages postés 145 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 15 avril 2016 - 5 juin 2007 à 18:01
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 6 juin 2007 à 18:49
Bonjour,
voila je cherche à exécuté une commande contenant une variable changeante à l'intérieur d'un foreach.

Ma commande fonctionne si je ne rajoute pas le " cut " de la ligne my $varin.


foreach $VAR (`snmpwalk sd21  -c public  -v 2c Ifoperstatus | grep up | grep 101 | cut -d "." -f2 | cut -d " " -f1`) {

                my $varin = `snmpwalk sd21 -c public -v 2c ifInOctets.$VAR | cut -d " " -f4` ;

                print"$varin\n";
                }


Message d'erreur:
sh: -c: line 1: syntax error near unexpected token `|'
sh: -c: line 1: ` | cut -d " " -f4'
IF-MIB::ifInOctets.10128 = Counter32: 3717836653


Si quelqu'un peut m'aider, c'est mon premier script PERL lol

Merci

A voir également:

10 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
5 juin 2007 à 19:15
Salut,

je n'ai pas d'erreur de syntaxe
lami20j@debian:~$ cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;
foreach my $VAR (`snmpwalk sd21  -c public  -v 2c Ifoperstatus | grep up | grep 101 | cut -d "." -f2 | cut -d " " -f1`) {
    my $varin = `snmpwalk sd21 -c public -v 2c ifInOctets.$VAR | cut -d " " -f4` ;
    print"$varin\n";
}
lami20j@debian:~$ perl -cW ccm.pl
ccm.pl syntax OK
que doit faire ton code?
0
floxi Messages postés 145 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 15 avril 2016 94
6 juin 2007 à 08:03
Merci de ta réponse,
explication:

En fait voila ce que devrais faire le code , pour chaque interface up d'un switch, afficher uniquement le débit entrant, via la commande snmpwalk.

J'essai en fait de transcrire ce script shell en PERL:

for i in `snmpwalk $host  -c $com -v $vers Ifoperstatus | grep up | grep 101 | cut -d "." -f2 | cut -d " " -f1`  ; do
        varin=`snmpwalk sd21 -c public -v 2c ifInOctets.$i| cut -d " " -f4``

        in=`sh $rep/scriptbc $in+$varin`


done



Si j'enleve du code perl le " | cut -d " " -f4" voila ce que cela ramène:
IF-MIB::ifInOctets.10101 = Counter32: 883735657

IF-MIB::ifInOctets.10102 = Counter32: 4226079414

IF-MIB::ifInOctets.10103 = Counter32: 2947602820

IF-MIB::ifInOctets.10105 = Counter32: 3821959613

IF-MIB::ifInOctets.10106 = Counter32: 852246388

IF-MIB::ifInOctets.10108 = Counter32: 560528995

IF-MIB::ifInOctets.10109 = Counter32: 672882322

IF-MIB::ifInOctets.10110 = Counter32: 247499512

IF-MIB::ifInOctets.10111 = Counter32: 613109941

IF-MIB::ifInOctets.10112 = Counter32: 3541198374

IF-MIB::ifInOctets.10113 = Counter32: 1954398019

IF-MIB::ifInOctets.10114 = Counter32: 2185799660

IF-MIB::ifInOctets.10115 = Counter32: 768

IF-MIB::ifInOctets.10116 = Counter32: 3930895612

IF-MIB::ifInOctets.10117 = Counter32: 2615655947

IF-MIB::ifInOctets.10120 = Counter32: 1084073186

IF-MIB::ifInOctets.10121 = Counter32: 856584858

IF-MIB::ifInOctets.10122 = Counter32: 1845225790

IF-MIB::ifInOctets.10123 = Counter32: 83744505

IF-MIB::ifInOctets.10124 = Counter32: 3057346105

IF-MIB::ifInOctets.10125 = Counter32: 3162132350

IF-MIB::ifInOctets.10127 = Counter32: 3862719933

IF-MIB::ifInOctets.10128 = Counter32: 784908254


Et ce que je désire c'est garder uniquement la dernière valeur

Des idées?

Merci de vos réponses
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juin 2007 à 10:17
Salut,


En fait voila ce que devrais faire le code , pour chaque interface up d'un switch, afficher uniquement le débit entrant, via la commande snmpwalk.

je pense que tu te compliques un peu

Si tu me donne ce qu'il t'affiche la commande
snmpwalk $host  -c $com -v $vers Ifoperstatus 
et tu me dit ce que tu veux, je pourrai tout parser en Perl sans avoir besoin d'utiliser des commandes Unix (grep, cut, etc).
Sinon, autant le faire en shell.

A toi.

0
floxi Messages postés 145 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 15 avril 2016 94
6 juin 2007 à 10:50
$ snmpwalk sd21 -c public -v 2c Ifoperstatus
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.3 = INTEGER: up(1)
IF-MIB::ifOperStatus.4 = INTEGER: up(1)
IF-MIB::ifOperStatus.5 = INTEGER: up(1)
IF-MIB::ifOperStatus.6 = INTEGER: up(1)
IF-MIB::ifOperStatus.10101 = INTEGER: up(1)
IF-MIB::ifOperStatus.10102 = INTEGER: up(1)
IF-MIB::ifOperStatus.10103 = INTEGER: up(1)
IF-MIB::ifOperStatus.10104 = INTEGER: down(2)
IF-MIB::ifOperStatus.10105 = INTEGER: up(1)
IF-MIB::ifOperStatus.10106 = INTEGER: up(1)
IF-MIB::ifOperStatus.10107 = INTEGER: down(2)
IF-MIB::ifOperStatus.10108 = INTEGER: up(1)
IF-MIB::ifOperStatus.10109 = INTEGER: up(1)
IF-MIB::ifOperStatus.10110 = INTEGER: up(1)
IF-MIB::ifOperStatus.10111 = INTEGER: up(1)
IF-MIB::ifOperStatus.10112 = INTEGER: up(1)
IF-MIB::ifOperStatus.10113 = INTEGER: up(1)
IF-MIB::ifOperStatus.10114 = INTEGER: up(1)
IF-MIB::ifOperStatus.10115 = INTEGER: up(1)
IF-MIB::ifOperStatus.10116 = INTEGER: up(1)
IF-MIB::ifOperStatus.10117 = INTEGER: up(1)
IF-MIB::ifOperStatus.10118 = INTEGER: down(2)
IF-MIB::ifOperStatus.10119 = INTEGER: down(2)
IF-MIB::ifOperStatus.10120 = INTEGER: up(1)
IF-MIB::ifOperStatus.10121 = INTEGER: up(1)
IF-MIB::ifOperStatus.10122 = INTEGER: up(1)
IF-MIB::ifOperStatus.10123 = INTEGER: up(1)
IF-MIB::ifOperStatus.10124 = INTEGER: up(1)
IF-MIB::ifOperStatus.10125 = INTEGER: up(1)
IF-MIB::ifOperStatus.10126 = INTEGER: down(2)
IF-MIB::ifOperStatus.10127 = INTEGER: up(1)
IF-MIB::ifOperStatus.10128 = INTEGER: up(1)
IF-MIB::ifOperStatus.14501 = INTEGER: up(1)

Il faut comptabiliser uniquement les interface 10101->10128

merci
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juin 2007 à 13:24
Ben, il y a une incohérence en ce qui tous demande


IF-MIB::ifInOctets.10128 = Counter32: 784908254

et ça

IF-MIB::ifOperStatus.14501 = INTEGER: up(1)

Il n'y a pas la possibilté d'obtenir un résultat groupé groupé ?

Tu applique la commande snmpwalk sur un résultat d'une commande précedente snmpwalk, c'est un peu rédondant.

Quelque chose de genre (je ne connais pas cette application)
snmpwalk sd21 -c public -v 2c Ifoperstatus -v 2c ifInOctets


0

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

Posez votre question
floxi Messages postés 145 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 15 avril 2016 94
6 juin 2007 à 14:51
Non on ne peut rassembler les deux valeur car il doit y avoir un test :

Si: l'interface est UP (ifoperstatus)
Alors: comptabiliser le traffic ( ifinoctect)


Je pense ne pas etre loin de la solution avec mon script il faut juste résoudre cette petite erreur peut etre des guillment des crochet je ne sais pas et ne trouve pas :
`snmpwalk sd21 -c public -v 2c ifInOctets.$VAR | cut -d " " -f4` ;


0
floxi Messages postés 145 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 15 avril 2016 94
6 juin 2007 à 15:38
Apparament cela s'avère plus compliqué que je ne le pensait.

Résumé de ce que je cherche une commande perl qui feria ca:
j'ai:

IF-MIB::ifInOctets.10101 = Counter32: 2522564922

IF-MIB::ifInOctets.10102 = Counter32: 3048390914

IF-MIB::ifInOctets.10103 = Counter32: 3037847876

IF-MIB::ifInOctets.10105 = Counter32: 4002527322

IF-MIB::ifInOctets.10106 = Counter32: 858424052


Je shouhaite obtenir cela:
2522564922
3048390914
3037847876
4002527322
858424052
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juin 2007 à 15:42
essaie
foreach $VAR (`snmpwalk sd21  -c public  -v 2c Ifoperstatus | grep up | grep 101 | cut -d "." -f2 | cut -d " " -f1`) {
  my $varin = `snmpwalk sd21 -c public -v 2c ifInOctets.$VAR` ;
  $varin =~ s/.*:\s*//;
  print"$varin\n";
}



0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juin 2007 à 15:45
oups, error!
0
floxi Messages postés 145 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 15 avril 2016 94
6 juin 2007 à 16:19
Ca marche,
$varin =~ s/.*:\s*//;


Moi qui fesait que du shell c'est quand meme un peu plus compliqué qu'un "cut" lol.

Un grand merci lami20j
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juin 2007 à 16:22
c'est quand meme un peu plus compliqué qu'un "cut" lol.

c'est compliqué quand on ne sait pas :-))
et c'est facile quand on le sait :-))

Quand j'ai parlé de cut je n'ai pas pensé au simple, mais plutôt à la paresse :-))
Trop de cut quand même.

Voilà une version optimisé (je ne l'ai pas testé, mais pas de cut ou grep shell, le grep que j'utilise c'est une fontion Perl), je vais le tester ce soir chez moi. Je mets en résolu quand même :-)

foreach $VAR ( grep { /(101\d*)\s*=.*up/ } `snmpwalk sd21  -c public  -v 2c Ifoperstatus` ) {
  my $varin = `snmpwalk sd21 -c public -v 2c ifInOctets.$VAR` ;
  print"$varin\n";
}
--
lami20j
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juin 2007 à 18:49
Essaie ça
foreach $VAR ( grep { s/.*(101\d*)\s*=.*up.*/$1/ }
    `snmpwalk sd21  -c public  -v 2c Ifoperstatus` ) {
     my $varin = `snmpwalk sd21 -c public -v 2c ifInOctets.$VAR` ;
     print"$varin\n";
}
0