Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2011, 17h10   #1
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Par défaut Problème avec AWK

Bonjour,

je suis en train de modifier un script constructeur afin de pouvoir générer des alarmes vers mon outil de supervision. Globalement je m'en suis bien sorti, mais une partie du code me pose problème a cause d'un awk.

Mon problème concerne la fonction CheckSlices.
J'ai besoin selon la boucle qui est utilisée d'envoyer une commande (OPCMON), j'ai essayé plusieurs syntaxes.

ajout directement après le print:
Code :
1
2
3
4
if ($n != $3) {
   print "NOK - slice", $1, "instance", $2, ": wrong number of documents (found:", $3, "expected:", n,")";
   OPCMON
}
Ajout d'une variable:
Code :
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
CheckSlices()
{
      grep "<IndexSliceInstanceStatus" | sed -e 's/^.*indexSlice="//' -e 's/" sliceInstance="/ /' \
        -e 's/".*ndocs="/ /' -e 's/".*replicationIsUpToDate="/ /' \
        -e 's/" replicationIsBlocking="/ /' -e 's/".*//' | awk '
{
        if (NR==1 || s!=$1) {
                s=$1;
                n=$3;
        }
        if ($n != $3) {
                print "NOK - slice", $1, "instance", $2, ": wrong number of documents (found:", $3, "expected:", n,")";
                $monitor=1
        }
        if ($4 != "true") {
                print "NOK - slice", $1, "instance", $2, ": replication problem (not up to date)";
        }
        if ($5 != "false") {
                print "NOK - slice", $1, "instance", $2, ": replication problem (blocking)";
        }
}
'
if ($monitor==1)
then
   OPCMON
}
BILAN:
Si je reste dans la boucle du awk, il me crache des erreurs de syntaxe car le awk semble évaluer la commande OPCMON
Si je sors du awk, la variable $monitor reste vide.

Si quelqu'un a la moindre idée d'une syntaxe qui pourrait me permettre de m'en sortir... d'avance merci, surtout que je ne suis pas certain que mon problème soit bien explicité.



Code complet (fonction Chekslice original constructeur):
Code :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#set -x
 
OPCMON=/opt/OV/bin/opcmon
 
 
Usage()
{
        echo "Usage: $1 [-c A|B [-bg 0|1|...|-lbg]]"
        exit 1
}
 
CheckSlices()
{
#0 front1_1 1391260 true false
#0 front2_1 1391260 true false
#0 master 1391260 true false
#1 front1_1 1381123 true false
#1 front3_1 1381123 true false
#1 master 1381123 true false
 
        grep "<IndexSliceInstanceStatus" | sed -e 's/^.*indexSlice="//' -e 's/" sliceInstance="/ /' \
        -e 's/".*ndocs="/ /' -e 's/".*replicationIsUpToDate="/ /' \
        -e 's/" replicationIsBlocking="/ /' -e 's/".*//' | awk '
{
        if (NR==1 || s!=$1) {
                s=$1;
                n=$3;
        }
        if ($n != $3) {
                print "NOK - slice", $1, "instance", $2, ": wrong number of documents (found:", $3, "expected:", n,")";
        }
        if ($4 != "true") {
                print "NOK - slice", $1, "instance", $2, ": replication problem (not up to date)";
        }
        if ($5 != "false") {
                print "NOK - slice", $1, "instance", $2, ": replication problem (blocking)";
        }
}
'
}
 
CR=0
C=""
BG=""
while [ $# -gt 0 ]
do
        case $1 in
        -c) C=$2; shift;;
        -bg) BG=$2; shift;;
        -lbg) [ x"$C" = "xA" ] && echo "0 1" || echo "0 1 2 3"; exit 0;;
        *) Usage $0;;
        esac
        shift
done
 
[ x"$C" = "x" ] && LC="A B" || LC=$C
for c in $LC
do
        [ -f $c/exalead_env ] && . $c/exalead_env || . $c/exabis_env
        [ x"$BG" = "x" ] && {
                case $c in
                A) LBG="0 1";;
                B) LBG="0 1 2 3";;
                esac
        } || LBG=$BG
 
        for i in $LBG
        do
                echo -n "ssh $EXA_USER@$EXA_ADM_HOST admin/bin/cvcommand :$EXA_ADM_PORT mami/indexing getBuildGroupStatus buildGroup=bg$i => "
                res=`ssh $EXA_USER@$EXA_ADM_HOST admin/bin/cvcommand :$EXA_ADM_PORT mami/indexing getBuildGroupStatus buildGroup=bg$i 2>/dev/null | xmllint --format - 2>/dev/null`
                [ $? -ne 0 ] && {
                        echo "OK (stopped ?)"
                        continue
                }
 
                status1=`echo "$res" | egrep 'replicationIsBlocking="true"|replicationIsUpToDate="false"'`
                CR1=$?
                status2=`echo "$res" | egrep 'PushServerStatus enabled="false"'`
                CR2=$?
                status3=`echo "$res" | egrep 'flowControlThrottling="true"'`
                CR3=$?
                status4=`echo "$res" | egrep 'flowControlBlocking="true"'`
                CR4=$?
 
                ([ $CR1 -eq 0 ] || [ $CR2 -eq 0 ] || [ $CR3 -eq 0 ] || [ $CR4 -eq 0 ]) && (CR=1; echo "NOK") || echo "OK"
 
                if [ x"$status1" != "x" ]
                then
                        status5=`echo "$res" | CheckSlices | grep NOK`
                        echo "$status5"
                fi
                if [ x"$status2" != "x" ]
                then
                        $OPCMON AFP_exalead_CheckBuildGroupStatus=1 -object PushServerStatus -option cause="PushServerStatus enabled=false"
                fi
                if [ x"$status3" != "x" ]
                then
                        $OPCMON AFP_exalead_CheckBuildGroupStatus=1 -object flowControlThrottling  -option cause="flowControlThrottling=true"
                fi
                if [ x"$status4" != "x" ]
                then
                        $OPCMON AFP_exalead_CheckBuildGroupStatus=1 -object flowControlBlocking -option cause="flowControlBlocking=true"
                fi
 
        done
done
exit $CR
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/03/2011, 18h16   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

Tout d'abord cette fonction est pourrie !
On ne fait pas grep | sed | awk : et sed et awk peuvent par eux-même faire un grep, et awk peut faire les transformations exécutées par sed.

if n'est pas une boucle !

Ensuite, les variables shell sont ne sont pas reconnues par awk, il faut les lui passer avec l'option -v; les variables de awk ne sont pas reconnues par le shell.
Pour faire exécuter des commandes externes par awk, il faut utiliser la fonction system().

Enfin, vue la manière dont est utilisée la fonction CheckSlices, tu ne devrais pas chercher à lui faire exécuter une commande.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 15h32   #3
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Hello,

bon j'ai pu m'en sortir partiellement en utilisant la fonction system(), merci du tuyau

par contre je me pose une question, les variables utilisées par awk (ex: "NOK - slice", $1) peuvent elles être réutilisées dans ma cmd OPCMON ??
Pour le moment elles ne semblent pas évaluée, l'appel de la fonction system doit donc sortir du contenaire du awk je suppose.

PS: dsl si mon vocable est encore perfectible
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 15h48   #4
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Je complète ma question.

ma commande OPCMON étant un peu particulière, je me demande si ce que je veux est possible:

Code :
1
2
print "NOK - slice", $1, "instance", $2, ": wrong number of documents (found:", $3, "expected:", n,")";
system("/opt/OV/bin/opcmon exalead_CheckBuildGroupStatus=1 -object Replication -option cause=" $1)
Je voudrais que $1 soit la value de l'option "cause", mais je ne sais pas trop comment faire, jusqu'a présent tous mes tests ne sont pas concluants...

Une idée ??

D'avance merci
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 16h20   #5
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Edit:

bon en réalité cette syntaxe fonctionne, en tout cas elle fontionne pour 2 de mes 3 conditions, j'en conclus que mon script doit avoir un comportement anormal pour le premier if.

Je vais étudier cela.

Merci de votre aide.
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 14h36   #6
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Re,

N_BAH, j'ai un nouveau script, a nouveau avec un awk, j'ai besoin de récupérer une variable contenu dans mon script, mais la variable est toujours vide, pourtant mon tableau de résultat final indique bien une valeur pour la variable $ecart.

Je ne vois vraiment pas pourquoi awk ne parvient pas à recup la valeur.

Voici mon script:

Code :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
   1 set -x
      2
      3 max()
      4 {
      5         [ $1 -gt $2 ] && echo "$1" || echo "$2"
      6 }
      7
      8 abs()
      9 {
     10         [ $1 -gt 0 ] && echo $1 || echo `expr $1 \* \-1`
     11 }
     12
     13 # Prod/A docsInIndexBg0 docsInIndexBg1 ecart
     14 Fmt()
     15 {
     16         var=$ecart;
     17         awk -v var2=$(var) '
     18 BEGIN {
     19         printf("%-10.10s %-10.10s %-10.10s %-10.10s\n", "Config", "#docs(bg0)", "#docs(bg1)", "Ecart");
     20 }
     21 {
     22         printf("%-10.10s %-10d %-10d %-10d\n", $1, $2, $3, $4);
     23         if ($var2 == 0){
     24         then
     25         system("/opt/OV/bin/opcmon AFP_exalead_MonitorIndexation=1 -object " $1);
     26         }
     27 }
     28 '
     29 }
     30
     31 for c in Dev/A Dev/B
     32 do
     33         [ ! -d $c ] && echo "$c: Configuration inconnue" && continue
     34         [ -f $c/exalead_env ] && . $c/exalead_env || . $c/exabis_env
     35         docsInIndexBg0=`su - $EXA_USER -c "admin/bin/cvcommand http://$EXA_ADM_HOST:$EXA_ADM_PORT mami/indexing getProbeValuesForBuildGroup b        uildGroup=bg0 | xmllint --format - | grep docsInIndex | sed -e 's/^.*value="//' -e 's/".*//'"`
     36         docsInIndexBg1=`su - $EXA_USER -c "admin/bin/cvcommand http://$EXA_ADM_HOST:$EXA_ADM_PORT mami/indexing getProbeValuesForBuildGroup b        uildGroup=bg1 | xmllint --format - | grep docsInIndex | sed -e 's/^.*value="//' -e 's/".*//'"`
     37
     38         ecart=`expr $docsInIndexBg0 - $docsInIndexBg1`
     39         echo "$c $docsInIndexBg0 $docsInIndexBg1 `abs $ecart`"
     40 done | Fmt

D'avance merci pour votre aide
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 15h02   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

Code :
1
2
3
4
5
Fmt()
 {
         var=$ecart;
         awk -v var2=${ecart} '
 BEGIN {
...
et pas de $ pour les noms de variables en awk.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/04/2011, 15h14   #8
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Yep,

merci de ta rapidité

Malheureusement cela ne fonctionne toujours pas, la variable ecart n'est toujours pas évaluée, ci joint l'output du set -x

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
++ for c in Dev/A Dev/B
++ Fmt
++ '[' '!' -d Dev/A ']'
++ echo 'Dev/A: Configuration inconnue'
++ continue
++ for c in Dev/A Dev/B
++ '[' '!' -d Dev/B ']'
++ echo 'Dev/B: Configuration inconnue'
++ continue
++ awk -v var2= '
BEGIN {
        printf("%-10.10s %-10.10s %-10.10s %-10.10s\n", "Config", "#docs(bg0)", "#docs(bg1)", "Ecart");
}
{
        printf("%-10.10s %-10d %-10d %-10d\n", $1, $2, $3, $4);
        if ( var2 == 0 ){
        then
        system("/opt/OV/bin/opcmon AFP_exalead_MonitorIndexation=1 -object " $1);
        }
}
'
Config     #docs(bg0) #docs(bg1) Ecart
Dev/A:     0          0          0
Dev/B:     0          0          0

Il m'enquiquine ces awk
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 15h39   #9
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Code :
++ echo 'Dev/B: Configuration inconnue'
!
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 16h24   #10
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Oui je suis dans un env de dev mais le script va chercher ailleurs les infos dont il a besoin:

Code :
[ -f $c/exalead_env ] && . $c/exalead_env || . $c/exabis_env
Si tu regardes le tableau d'output, on voit bien que la variable $ecart à bien la valeur 0 ici.

Donc je devrais être en mesure de récupérer son contenu, non ?
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 16h47   #11
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
ce que je vois, c'est que le script teste Dev/A, ne le trouve pas, et reprend la boucle for avec Dev/B, qui se finit (la boucle for) en "passant des arguments" qui n'existent pas à awk

pour être sûr, comment exécutes-tu le script ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 17h18   #12
Nouveau Membre du Club
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 30
Points : 30
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhh

t'as raison, je suis une sous quiche

Ce sont des scripts constructeurs a la base que je devais juste enrichir, mais sans rien connaitre de la plateforme... ce n'est pas une excuse cependant !

Bon du coup j'ai repris un bout d'un autre script et désormais cela fonctionne.

Vraiment désolé, je n'arrive pas toujours a prendre assez de recul pour voir l'évidence

Encore merci a toi.
nicnictout est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 17h34   #13
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par nicnictout Voir le message
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhh

t'as raison, je suis une sous quiche

Encore merci a toi.
meuh non, le reconnaitre c'est déjà passer du statut de sous quiche à celui de simple quiche.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h55.


 
 
 
 
Partenaires

Hébergement Web