IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Problème avec AWK


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 467
    Points
    19 467
    Par défaut
    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.

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    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

  4. #4
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Je complète ma question.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    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.

  6. #6
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 467
    Points
    19 467
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Fmt()
     {
             var=$ecart;
             awk -v var2=${ecart} '
     BEGIN {
    ...
    et pas de $ pour les noms de variables en awk.

  8. #8
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 467
    Points
    19 467
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ++ echo 'Dev/B: Configuration inconnue'
    !

  10. #10
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Oui je suis dans un env de dev mais le script va chercher ailleurs les infos dont il a besoin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ -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 ?

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 467
    Points
    19 467
    Par défaut
    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 ?

  12. #12
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    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.

  13. #13
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec Awk
    Par morgoths dans le forum Linux
    Réponses: 1
    Dernier message: 21/04/2010, 16h37
  2. Problème avec awk
    Par bstages2000 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 03/12/2007, 12h58
  3. Problème avec awk et un pipe
    Par Chatbour dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 14/10/2007, 11h40
  4. problème avec la commande awk
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 05/06/2007, 13h02
  5. Problème avec awk
    Par Michaël dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/08/2006, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo