syntaxe :
awk [-Fs] [-v variable] [-f fichier de commandes] 'program' fichier
-F | Spécifie les séparateurs de champs |
-s | ??? |
-v | Définie une variable utilisée à l'intérieur du programme. |
-f | Les commandes sont lu à partir d'un fichier. |
examples: | |
awk -F ":" '{ $2 = "" ; print $0 }' /etc/passwd |
imprime chaque ligne du fichier /etc/passwd après avoir effacé le deuxième champs |
awk 'END {print NR}' fichier |
imprime le nombre total de lignes du fichiers |
awk '{print $NF}' fichier |
imprime le dernier champs de chaque ligne |
who | awk '{print $1,$5}' |
imprime le login et le temps de connexion. |
awk 'length($0)>75 {print}' fichier |
imprime les lignes de plus de 75 caractères. (print équivaur à print $0) |
Variable | Signification | Valeur par défaut |
---|---|---|
ARGC | Nombre d'arguments de la ligne de commande | - |
ARGV | tableau des arguments de la ligne de commnde | - |
FILENAME | nom du fichier sur lequel on applique les commandes | - |
FNR | Nombre d'enregistrements du fichier | - |
FS | separateur de champs en entrée | " " |
NF | nombre de champs de l'enregistrement courant | - |
NR | nombre d'enregistrements deja lu | - |
OFMT | format de sortie des nombres | "%.6g" |
OFS | separateur de champs pour la sortie | " " |
ORS | separateur d'enregistrement pour la sortie | "\n" |
RLENGTH | longueur de la chaine trouvée | - |
RS | separateur d'enregistrement en entrée | "\n" |
RSTART | debut de la chaine trouvée | - |
SUBSEP | separateur de subscript | "\034" |
un expression régulière
une expression BEGIN ou END
| une expression de comparaison: <, <=, == , !=, >=, >
| une combinaison des trois (à l'aide des opérateurs booléens || ou, && et, ! négation)
| une caractérisation des lignes | motif1,motif2 : chaque ligne entre la premiere ligne correspondant au motif1 et la première ligne correspondant au motif2 |
awk 'BEGIN { print "Verification des UID et GID dans le fichier /etc/passwd"; FS=":"} $3 !~ /^[0-9][0-9]*$/ {print "UID erreur ligne "NR" :\n"$0 } $4 !~ /^[0-9][0-9]*$/ {print "GID erreur ligne "NR" :\n"$0 } END { print "Fin" } ' /etc/passwdRésultat :
awk 'BEGIN { print "Verification du fichier /etc/passwd pour ..."; print "- les utilisateurs avec UID = 0 " ; print "- les utilisateurs avec UID >= 60000" ; FS=":"} $3 == 0 { print "UID 0 ligne "NR" :\n"$0 } $3 >= 60000 { print "UID >= 60000 ligne "NR" :\n"$0 } END { print "Fin" } ' /etc/passwdRésultat :
awk 'BEGIN { print "Verification du fichier /etc/group"; print "le groupe 20 s'appelle t-il bien users ? " ; FS=":"} $1 == "users" && $3 ==20 { print "groupe "$1" a le GID "$3" !" } END { print "Fin" } ' /etc/groupRésultat :
awk 'NR == 5 , NR == 10 {print NR" : " $0 }' fichierImprime de la ligne 5 à la ligne 10 , chaque ligne précédée par son numéro
fonctions prédéfinies, numerique ou chaine de caracteres
controle de flots
| affectation
| impression
| |
Nom des fonctions | signification |
---|---|
atan2(y,x) | arctangente de x/y en redians dans l'interval -pi pi |
cos(x) | cosinus (en radians) |
exp(x) | exponentielle e à la puissance x |
int(x) | valeur entière |
log(x) | logarythme naturel |
rand() | nombre aléatoire entre 0 et 1 |
sin(x) | sinus (en radians) |
sqrt(x) | racine carrée |
srand(x) | reinitialiser le générateur de nombre aléatoire |
Nom des fonctions | signification | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
gsub(r,s,t) | sur la chaine t, remplace toutes les occurance de r par s |
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 |
| sub(r,s,t) | comme gsub, mais remplce uniquement la première occurence |
| substr(s,i,n) | retourne la sous chaine de s commencant en i et de taille n |
| |
Les opérateurs arithmétiques sont les opérations usuelles : + - * / % (reste division entière) et ^ (puissance).
Tous les calculs sont effectués en virgule flottante.
La syntaxe de l'affectation : var = expression | Vous pouvez aussi utiliser les operateurs +=, -=, *=, /=, %= et ^= (x+=y équivaut à x=x+y) |
awk 'BEGIN { FS=":" ; OFS=":"} $NF != "/bin/ksh" { print $0 } $3 == "/bin/ksh" && NF == 7 { $7 = "/bin/posix/sh" ; print $0 } ' /etc/passwd > /etc/passwd.newRésultat :
awk '{ print NR " : " $0 }' fichierRésultat :
awk 'BEGIN { FS=":" ; OFS=":" ; print " Run Level 2 : Liste des actions "} $2 ~ /2/ { print "Keyword <<"$3">>, \n Tache <<"$4">>" } $2 == "" { print "Keyword <<"$3">>, \n Tache <<"$4">>" } ' /etc/inittab > /etc/passwd.newRésultat :
specifieur | signification |
d | nombre decimal |
s | chaine de caractères |
specifieur | signification |
- | expression justifiée à gauche |
largeur | largeur d'affichage |
.precision | longueur maximale d'une chaine de caracteres ou nombre de decimales |
awk ' { print NR " :" , $0 > "fich.numerote" } ' fichier |
le fichier fich.numerote contient le fichier fichier avec les lignes numérotées
|
awk ' { printf "%3d : %s " , NR , $0 > "fich.numerote" } ' fichier |
le fichier fich.numerote contient le fichier fichier avec les lignes numérotées sur 3 caractères
|
awk 'BEGIN { print "Mémorisation de votre fichier " FILENAME } {memfile [NR] = $0 } END { for ( i = NR ; i >= 1 ; i-- ) { print i ":" memfile[i] } print "Fin" } ' fichierRésultat :
awk ' NF > 0 { for (i=1;i<=NF;i++) { if ( $i ~ /^[0-9a-zA-Z][0-9a-zA-Z]*$/ ) { index[$i] = index[$i] ";" NR "," i " " ; index["total"]++ ; } } } END { x="total" ; printf("%s mots detectés = %d\n",x,index[x]); } ' fichierRésultat :
for (var in tableau) action
awk ' NF > 0 { for (i=1;i<=NF;i++) { if ( $i ~ /^[0-9a-zA-Z][0-9a-zA-Z]*$/ ) { index[$i] = index[$i] ";" NR "," i " " ; index["total"]++ ; } } } END { for ( x in index ) { if ( x != "total" ) printf("%-20s\t%s\n",x,index[x]) | "sort -f " } x="total"; printf("%s mots detectés = %d\n",x,index[x]); } ' fichierRésultat :
awk 'BEGIN { print "Mémorisation de votre fichier " FILENAME SUBSEP=":" } { for ( i=1 ; i <=NF ; i++ ) { memfields[ NR , i ] = $i } } END { for ( i in memfields ) { print i ":" memfields[i] | "sort -n -t: " } print "Fin" } ' fichierRésultat :