[PERL] commande pour un débutant

Résolu
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

--
Flox
Configuration: Windows XP
Firefox 2.0.0.4

10 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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";
    }
    1. Modérateur
      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
      1. 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
        1. Modérateur
          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";
          }


          1. 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` ;

            1. 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
          2. Modérateur
            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

            1. Modérateur
              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.

              1. $ 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
            2. 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
              1. Modérateur
                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?