AWK_Doc

AWK acronyme de (Aho, Weinberger and Kernighan)

  • WIKI - Qu'est ce AWK ?
  • Un condensé des commandes en PDF
  • Un condensé des commandes en TXT
  • Page man de AWK
  • Une synthèse de la commande AWK
  • Autre synthèse de la commande AWK
  • Good examples AWK
  • Exemples
    • Les principales fonctions pour traiter les chaines de caractères
    • 
      
      Nom des fonctions signification
      gsub(r,s,t) sur la chaine t, remplace toutes les occurance de r par s
      sub(r,s,t) comme gsub, mais remplace uniquement la première occurence
      index(s,t) retourne la position la plus à gauche de la chaine t dans la chaine s
      length(s) retourne la longueur de la chaine s
      match(s,r) retourne l'index ou s correspond à r et positionne RSTART et RLENTH
      split(s,a,fs) split s dans le tableau a sur fs, retourne le nombre de champs
      sprintf(fmt,liste expressions) retourne la liste des expressions formattée suivant fmt
      substr(s,i,n) retourne la sous chaine de s commencant en i et de taille n
    • Affiche lignes du fichier en entrée dès rencontre chaîne debut et jusqu'à chaîne fin ou EOF
    • 
      shell>  awk '/debut/,/fin/' regle.awk
      #----------- marge debut
           imarge=ARGV[2];
           marge="" ;
           if ( imarge != "" ) { for ( ;imarge > 0; imarge-- ) { marge=marge" " } }
      #----------- plus info en fin de regle
      
    • Changer valeur sur une colonne de la ligne
    • 
      shell> echo '1456 E 17-oct-2016 FIFABRMIMA05 CSARSENE L0006DI7 TERMINE EAIE.U00PM00.CSARSENE.TSRI03ME.J1701253.N0 FICHIER RSA CNAF ' | \
       awk '{ for ( i=1;i<NF;i++) { if (match($i,"P00") || match($i,"L00")) { gsub($i,"<a href= ..>"$i"</a>",$i) }} ; print $0 }'
      
      shell> 1458 E 17-oct-2016 FIFABRMIMA05 CSARSENE <a href= ..>L0006DI7</a> TERMINE EAIE.U00PM00.CSARSENE.TSRI03ME.J1701253.N0 FICHIER RSA CNAF
      
      
    • Divers et très utiles
    • 
      voir site Good examples AWK
      
      
    • Comme sort -u
    • shell> awk -F',' '{a[$1];}END{for (i in a)print i;}' file shell> awk -F, '!a[$2]++' file
    • Total par colonne et reference
    • shell> awk -F, '{a[$1]+=$2;}END{for(i in a)print i", "a[i];}' file toto,100 titi,200 titi,500 => toto,100 titi,700
    • Different separateur dans fichier en entree et choix d'un separateur en sortie
    • shell> awk -F '[:,]' '{a[$1]++;}END{for (i in a)print i, a[i];}' OFS=':' file toto,100 titi:200 titi,500 => toto:100 titi:700
    • Total sur une colonne donnée
    • shell> awk -F"," '{x+=$2;print}END{print "Total,"x}' file => Total, 800
    • Nombre d'occurrences sur une colonne donnée
    • shell> awk -F, '{a[$1]++;}END{for (i in a)print i, a[i];}' file toto,100 titi,200 titi,500 => toto:1 titi:2
    • Affiche lignes contenant la chaîne nom
    • 
      shell>  ps -ef | awk '/nom/'
      
    • Test or || et &&
    • 
      shell>  if ( $2 ~ /toto/ || $2 ~ /tutu/ ) {   ...   }
      shell>  if ( $2 ~ /toto/ && $2 ~ /tutu/ ) {   ...   }
      
      
    • Lire un fichier à partir d'un enregistrement jusqu'à un autre
      • Script à definir dans un fichier
      • #!/bin/ksh LIGDEB=1 LIGFIN=100 FICHIER=fichier_a_traiter awk 'BEGIN { LIGDEB=ENVIRON["LIGDEB"] ; LIGFIN=ENVIRON["LIGFIN"] ; } (NR==LIGDEB),(NR==LIGFIN) {print} ; (NR==LIGFIN) {exit 0} ; ' ${FICHIER}
      • Commande online
      • shell> awk '(NR==1),(NR==3) {print} ' ${FICHIER}
    • Formater un fichier non structuré suivant une longueur donnée
      (idem cde fold - wrap each input line to fit in specified width- )
    • awk '{ ch=$0 ; for ( i=1 ; i<length(ch) ; i=i+128 ) { printf("%-9i %-9s %-9i %-s\n",NR,length(ch),i,substr(ch,i,128) ) } }' Fic
      
    • Creer directives sql insert d'après un fichier ayant les données separarées par #
    • 
      #-----------------------------------------------------
      # Mettre en table fichier table_routage_helios
      #-----------------------------------------------------
      #
      #
      #----- vider la table avant les inserts
      #----- ne pas prendre en compte les commentaires dans le fichier débutants par #
      awk 'BEGIN {print "TRUNCATE TABLE tab_routage;" } !/^#/ {
      
      #----- recuperer les champs séparés par # dans la table t
            split($0,t,"#")
      
      #----- debut de chaque insert à élaborer
            printf("INSERT INTO tab_routage VALUES (");
      
      #----- Nombre de colonnes de la table 
            MaxCh=14
      
      #----- Constituer les valeurs des colonnes de la table
            for ( j=1;j<=MaxCh ; j++ ) {
                 sep=","
                 if ( j == MaxCh ) sep="";
      
      #----- preserver les virgules sur données lues les bornées par \,
                 gsub(",","\\,",t[j])
      #----- preserver les quotes sur données lues les bornées par \'
                 gsub("'\''","\\'\''",t[j])
      
      #----- ecrire champ
                 printf("'\''%s\'\''%s",t[j],sep)
            }
      #----- fin de ligne pour chaque insert constitué
             printf(");\n")
      
      }' Fic
      
      
    • Tableaux associatifs
    • 
      #!/bin/sh
      #
      # to see many fic in /environnements/PROD/production/csgflawr/reception
      #   IDF an his heading
      #
      
      set -a 
      
      FicTmp=/cygdrive/c/temp/temp_$$
      
      # etat sas reception EAI
      
      ssh -t user@host 'df -g /environnements/PROD/production/csgflawr/reception/' | awk '{ print ; if ($0 ~ "/FS_NFS_SASSGF" ) tot=$2-$3 ; } END { print "Total utilisé en Go : "tot }' > ${FicTmp}
      ssh -t user@host 'find /environnements/PROD/production/csgflawr/reception/ -type f -exec head -n 1 {} + | cut -c1-100 ' > ${FicTmp}_
      echo -e
      cat ${FicTmp}
      echo -e
      
      awk 'BEGIN {
         tot=0 ;
         print "   +++++++++++++++++++++++++++++++++++++++++++++++++++" ; 
         printf("     %s | %-15s | %-10s | %10s \n","Num","Idf","  Id   Si","Nbre");
         print "   +++++++++++++++++++++++++++++++++++++++++++++++++++" ;
      }'
       grep ^DDF  ${FicTmp}_ | awk '{
       idf=substr($1,6,8);
       id=substr($0,22,4);
       si=substr($0,26,2);
      #--------- cle du tableau avec elements associatif dans ce cas trois variables
       nom=idf""id""si ;
      #--------- ajouter cle au tableau
       if ( nom != rnom ) {rnom=nom;tnom[rnom]++ } ;
      #--------- ajouter des colonnes de valeurs a la cle
       tidf[rnom]=idf ;tid[rnom]=id;tsi[rnom]=si;++tnbr[rnom] ;
      }
      END {
      #--------- editer le tableau
        for (lnom in tnom) 
       { i++ ; printf(" | %-15s |  %-4s  %-2s  | %10s \n",tidf[lnom],tid[lnom],tsi[lnom],tnbr[lnom] ) > "/cygdrive/c/temp/temp_9999__" ; tot=tot+tnbr[lnom] ; }
         printf("     Total %s %i\n",substr("                                          ",1,40-length(tot)),tot) > "/cygdrive/c/temp/temp_9999___" ;
      }' 
      
      sort -t'|' -k2.1,2.8 -k3.1,3.7 /cygdrive/c/temp/temp_9999__ | cat -n
      cat /cygdrive/c/temp/temp_9999___
      
      

    Exemple de AWK

    • Le source de regle.awk
    • Exemple de rendus
      1. Afficher une règle dans un terminal
        user@user:~$ awk -f ./regle.awk 101
                10        20        30        40        50        60        70        80        90        100
        ----+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----|
        
      2. Placer le début de la règle à partir de la colonne 10
        user@user:~$ awk -f ./regle.awk 91 10
                          10        20        30        40        50        60        70        80        90
                  ----+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----|
        
      3. En cas de depassement ou pour signaler une valeur max
        user@user:~$ awk -f ./regle.awk 80 10 300
                          10        20        30        40        50        60        70        80     300
                  ----+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----|......|
        
      4. Pour situer la règle apres PS1
        user@user:~$ awk -f ./regle.awk 81 $( expr ${#PS1} + ${#PWD} - 5 )
                             10        20        30        40        50        60        70        80
                     ----+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----|
        
        

    Exemple de AWK résultat de la commande cal ( calendar ) en html

    • source
    • Exemple de rendu
    • De la commande Linux ou AIX

    • 
      user@user:~$ cal 05 2013
            Mai 2013
      lu ma me je ve sa di
             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
      
      
    • On aura ça

    • Mai 2013
      Dim Lun Mar Mer Jeu Ven Sam
      1234
      567891011
      12131415161718
      19202122232425
      262728293031
    • Le php pour lancer ce AWK à partir d'un navigateur web


    Previous page: Scripts pour Gestion TSM
    Page suivante : Sed