bash isoler résultat

Le problème exposé dans ce sujet a été résolu.

Bonjour, je débute en bash et je voudrais réaliser un script qui vérifie des données sur la commande ibstat ibstat me retourne ceci par exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# ibstat
CA 'mlx4_0'
        CA type: MT25418
        Number of ports: 2
        Firmware version: 2.3.0
        Hardware version: a0
        Node GUID: 0x0002c9030002fb04
        System image GUID: 0x0002c9030002fb07
        Port 1:
                State: Active
                Physical state: LinkUp
                Rate: 20
                Base lid: 2
                LMC: 0
                SM lid: 1
                Capability mask: 0x02510868
                Port GUID: 0x0002c9030002fb05
        Port 2:
                State: Down
                Physical state: Polling
                Rate: 10
                Base lid: 0
                LMC: 0
                SM lid: 0
                Capability mask: 0x02510868
                Port GUID: 0x0002c9030002fb06

Je voudrais pour chaque port vérifier que Physical state: est égale à LinkUp sinon je retourne une erreur. J’arrive avec grep et awq à isoler le 1er Physical state, mais comment on fait pour faire une sorte de boucle for pour checker chaque "noeud" Port ? comme ceci :

1
ibstat | grep "Physical state" | awk '{ print $3 }'

mais pour tous les "Port" dans mon exemple je voudrais retourner "erreur avec le port 2". Je cherche un moyen de parcourir les noeuds port.

Bonjour jipete,

awk est un language à part entière, et permet de faire ce genre de choses facilement. La syntaxe de base, c’est [condition pour la ligne] { [actions à faire] }.

Du coup, ce qui est possible, c’est que dès que tu tombe sur une ligne qui match /Port [0-9]*/, assigner une variable avec le numéro du port, et dès que tu tombes sur une ligne qui match /Physical state/, tu print la variable contenant le port, et l’état contenu dans la ligne courante.

Ça donnerait un truc du genre:

1
2
3
4
5
6
7
$ ibstat | awk '
  /Port [0-9]*/ { port=$2 }
  /Physical state:/ { print "État du port", port, $3 }
'

État du port 1: LinkUp
État du port 2: Polling

La présence des : après le numéro de port vient du fait qu’on extrait la deuxième colonne des lignes avec le port, qui a donc le : avec.

Tu peux tout à fait changer le print pour qu’il affiche les infos que tu veux, des exemples d’utilisation de print se trouvent ici: https://www.gnu.org/software/gawk/manual/html_node/Print-Examples.html

+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte