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 :

[AWK+fonction] debug printf


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 157
    Par défaut [AWK+fonction] debug printf
    Bonjour,

    Je souhaiterai savoir à quoi correspond les valeurs b[1] b[2] b[3] b[4].
    En lançant Quelle est le bon format printf pour que ces valeurs apparaissent en mode debug ?

    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
    #!/bin/bash
    log_name=$1
    if [[ "$log_name" =~ .gz$ ]]
         then z_cat="gunzip -c"
         else z_cat=cat
    fi
    $z_cat $log_name |awk -F"[/ \\\][]" -v S="24/01/2013 10:10" -v E="24/01/2013 10:30" '
    function dcmp(b) {
      if($4>b[3])return  1;
      if($4<b[3])return -1;
      if($3>b[2])return  1;
      if($3<b[2])return -1;
      if($2>b[1])return  1;
      if($2<b[1])return -1;
      if($5>b[4])return  1;
      if($5<b[4])return -1;
      return 0;
    }
    BEGIN{split(S, ds, "[/ ]"); split(E, de, "[/ ]") }
    /^[[][0-9][0-9]\/[0-1][0-9]\/[[0-9][0-9][0-9][0-9] / {
       if(s&&dcmp(de)>=0) {print; exit}
       if(!s&&dcmp(ds)<=0) {f=x;w=1}
       if(!s&&dcmp(ds)>=0) {printf "%s",f; f=x; s=1 }
    }
    !w&&!s {f=f $0 "\n"}
    s'

    Pour info
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "[24/01/2013 10:10 10:30]" | awk -F"[/ \\\][]" '{ print FS ; print $2; print $3; print $4; print $5; print $6;}'
    renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [/ \][]
    24
    01
    2013
    10:10
    10:30
    Merci par avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par amazigh42 Voir le message
    Je souhaiterai savoir à quoi correspond les valeurs b[1] b[2] b[3] b[4].
    Manifestement, dcmp est une fonction de comparaison de dates (date compare).

    On compare d'abord les années ($4 et b[3]).
    Si elles sont différentes, on renvoie 1 ou -1 (suivant l'ordre).
    Si elles sont égales, on compare les mois ($3 et b[2]).
    S'ils sont différents, on renvoie 1 ou -1 (suivant l'ordre).
    S'ils sont égaux, on compare les jours ($2 et b[1]).
    S'ils sont différents, on renvoie 1 ou -1 (suivant l'ordre).
    S'ils sont égaux, on compare les heures ($5 et b[4]).
    Si elles sont différentes, on renvoie 1 ou -1 (suivant l'ordre).
    Si elles sont égales, on renvoie 0.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 157
    Par défaut
    Merci pour ta réponse, je voudrais renvoyer la valeur de b[3] à l'écran avec printf à l'instar de echo. Quelle commande exacte dois-je mettre pour éditer cette valeur ?

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("b[3]=[%s]\n",b[3]) > "/dev/tty";

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 157
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("b[3]=[%s]\n",b[3]) > "/dev/tty";
    Merci jlliagre, ta commande fonctionne. Mais je suis perplexe.

    Dans le POST #1 si on fait un echo de la ligne 7 du script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "[24/01/2013 10:10 10:30]" | awk -F"[/ \\\][]" '{ print FS ; print $2; print $3; print $4; print $5; print $6;}'
    On s'aperçoit que la variable $4 renvoie 2013
    Lorsque l'on insère la cde de jlliagre (POST #4) après la ligne 11 du script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("b[3]=[%s]\n",b[3]) > "/dev/tty";
    on voit queSachant que le fichier d'entrée server.log contient ce lignes
    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
    error jonas
    aaaaaaaaaaaaaa
    bbbbbbbbbbbbb
    cccccccccccc
    [24/01/2013 09:10]
    sssssssssssssss
    cccccccccccccc
    nnnnnnnnnnnnn
    [24/01/2013 10:10]
    uuuuuuuuuuuuuuu
    jjjjjjjjjjjjjj
    llllllllllllll
    mmmmmmmmmmmmm
    [24/01/2013 10:30]
    oooooooooooo
    sssssssssssss
    qqqqqqqqqqq
    [24/01/2013 10:45]
    vvvvvvvvv
    sssssssss
    wwwwwwwwww
    Ma question
    Pourquoi a-t-on 2 indices différents $4 et b[3] pour une même valeur 2013 sachant que le motif écrit en dur dans le script et celui de serveur.log sont équivalent à savoir [24/01/2013 10:10] ?

    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    parce que le crochet ouvrant [ est un séparateur de champs.
    cela implique que, avant lui (avant le crochet ouvrant), il y a un champ, qui est vide ($1).
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 157
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    parce que le crochet ouvrant [ est un séparateur de champs.
    cela implique que, avant lui (avant le crochet ouvrant), il y a un champ, qui est vide ($1).
    Si j'ai bien compris, dans le fichier server.log, le crochet ouvrant n'est quant à lui qu'un simple caractère.

    Merci pour ton explication.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    les variables S et E qui sont splittées pour créer le tableau b ne contiennent pas de crochets.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 157
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    les variables S et E qui sont splittées pour créer le tableau b ne contiennent pas de crochets.
    Après explications, c'est clair et logique.

    Je serai reconnaissant à la personne qui pourrait me donner une explication fine de ce morceau de script.
    Je sais seulement que les variables précédemment créées vE et Vs sont utilisées ici. Et qu'elles sont mises dans des tampons. J'aimerai si possible une explication plus détaillée, en te remerciant par avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BEGIN{split(S, ds, "[/ ]"); split(E, de, "[/ ]") }
    /^[[][0-9][0-9]\/[0-1][0-9]\/[[0-9][0-9][0-9][0-9] / {
       if(s&&dcmp(de)>=0) {print; exit}
       if(!s&&dcmp(ds)<=0) {f=x;w=1}
       if(!s&&dcmp(ds)>=0) {printf "%s",f; f=x; s=1 }
    }
    !w&&!s {f=f $0 "\n"}
    s'

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 157
    Par défaut
    Bonjour,

    Personne ne veut répondre à ma question Post 9
    J'ai bien fouillé dans le MAN awk, pas facile de trouver ma réponse.

    Merci par avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    avance d'abord une hypothèse, en commentaire pour chaque instruction, et on corrigera s'il y a lieu.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    awk '
    #instructions exécutées avant la lecture du fichier
    BEGIN {
    #etc
    ...' fichier
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 157
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    avance d'abord une hypothèse, en commentaire pour chaque instruction, et on corrigera s'il y a lieu.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    awk '
    #instructions exécutées avant la lecture du fichier
    BEGIN {
    #etc
    ...' fichier
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BEGIN{split(S, ds, "[/ ]"); split(E, de, "[/ ]") }
    /^[[][0-9][0-9]\/[0-1][0-9]\/[[0-9][0-9][0-9][0-9] / { #Fait correspondre les lignes qui commencent par deux chiffres suivis par une barre oblique puis 0 ou 1 puis des chiffres puis un slash et enfin 4 chiffres (c'est à dire 1 ligne qui commence par une date au format 99/99/9999).
       if(s&&dcmp(de)>=0) {print; exit} #si la date_de_départ déjà trouvé (s est non vide / zéro) et la date dans la ligne courante> = date_de_fin alors éditez ligne actuelle et arrêter le traitement.
       if(!s&&dcmp(ds)<=0) {f=x;w=1} #si la date_de_début n'est pas encore trouvé (s n'est pas initialisée) et la date dans la ligne actuelle <= date_de_début, contenu vierge de la variable f et initialiser le flag w. f est un tampon qui contient toutes les lignes trouvées à partir du début du document.
       if(!s&&dcmp(ds)>=0) {printf "%s",f; f=x; s=1 } #si les flags w et s ne sont pas initialisés coller la ligne courante dans le tampon de f.
    }
    !w&&!s {f=f $0 "\n"} #si les flags w et s ne sont pas initialisées, coller la ligne courante dans le tampon de f.
    s' # si le flag s n'est pas initialisé, éditer la ligne courante.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    ça a l'air de coller.

    petit point de terminologie : f,w,s sont des variables.
    certaines font office de drapeaux, d'autres servent à concaténer des lignes du fichier d'entrée.

    c'est marrant cette manière de vider f par l'emploi d'une variable qui n'est pas définie; quand je veux vider une variable, je lui assigne rien (f="").
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. [awk] Fonction printf et gestion des accents
    Par Gothan44 dans le forum Shell et commandes POSIX
    Réponses: 58
    Dernier message: 06/11/2013, 11h09
  2. Présenter la fonction Debug à mes collègues sur mon projet PHP ?
    Par Oppenheimer dans le forum NetBeans Platform
    Réponses: 1
    Dernier message: 15/04/2013, 17h49
  3. Debug printf with precompiled header
    Par elraton dans le forum C++
    Réponses: 10
    Dernier message: 07/07/2009, 15h41
  4. Commande awk fonction gsub
    Par vbcasimir dans le forum Linux
    Réponses: 1
    Dernier message: 29/05/2006, 11h12
  5. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

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