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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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.

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