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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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

+ 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