[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

  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?
    1. 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,

        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. 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. 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
          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. 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
              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. 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";
                }