![]()
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/passwd
Ré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/passwd
Ré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/group
Résultat :
awk 'NR == 5 , NR == 10 {print NR" : " $0 }' fichier
Imprime 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.new
Résultat :
awk '{ print NR " : " $0 }' fichier
Ré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.new
Ré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"
} ' fichier
Ré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]);
} ' fichier
Ré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]);
} ' fichier
Ré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"
} ' fichier
Résultat :
![]()
![]()