[PERL] commande pour un débutant

Résolu
floxi Messages postés 153 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. floxi Messages postés 153 Statut Membre 94
     
    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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. floxi Messages postés 153 Statut Membre 94
       
      $ 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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. floxi Messages postés 153 Statut Membre 94
     
    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
    1. floxi Messages postés 153 Statut Membre 94
       
      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
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    oups, error!
    0
  9. floxi Messages postés 153 Statut Membre 94
     
    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
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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