Outils pour utilisateurs

Outils du site


applications:outils_systeme:awk

awk

Sujets liés

Environnement

L'exécution de awk au travers de ssh nécessite de préfixer par '\' les sélecteurs de champ : \$1

Séparateur de champs

En entrée

BEGIN {
 FS=":";
}

ou

$ awk -F ':' '{...}'

En sortie

BEGIN {
 OFS=";";
}

Redirection sorties

Pour afficher des traces sur la console au lieu de stdout :

BEGIN {
    TTY=ENVIRON["SSH_TTY"];
}
 
{
    # Trace
    print "debug,information..." >TTY
}

locales

Régler par exemple un problème sur le séparateur des décimales.

$ set LANG=fr_FR && LC_ALL='fr_FR.UTF-8' && echo "1,2" | awk '{printf("%010.3f\n",$0);}'
000001,200
 
$ set LANG=C && LC_ALL=C && echo "1.2" | awk '{printf("%010.3f\n",$0);}'
000001.200

Afficher la date

{ print strftime("%Y/%m/%d-%H:%M:%S",systime()) }

Chaînes

Apostrophe

$ awk '{printf("\047%s\047,\n", $1);}' fichier

ou

$ awk -v Quote="'" '{print Quote $1 Quote ","}' fichier

Sortie:

'valeur1',
'valeur2',
...

Concaténer

for (i=2 ; i<=NF ; i++) { chaine=chaine " " $i }

A mettre en forme

------------------------------------------------------------------------
2.1.13	Awk
------------------------------------------------------------------------
	- Définition du séparateur :
			awk '{FS=":"; ...
		ou
			awk -F ':' ...

	- N'afficher qu'un champ
		# cat fichier.txt | awk '{print "champ3="$3}'

	- Insérer un X après la 9ème position et avant la 10ème
		$ awk '{for (i=1; i <= 9; i++) {printf("%s ", $i)} printf("X"); \
		  for (i=10; i <= NF; i++) {printf(" %s", $i);} printf("\n" );}' \
		  fichier.txt

	- Remplacer le mois (ici Dec pour décembre) par 12/2007 dans messages
		$ grep ERROR messages | egrep '^Dec' | \
		  awk 'BEGIN {printf("%s/12/2007",$2); \
		  for (i=3; i <= NF; i++) {printf(" %s", $i);} printf("\n" );}'

	- Faire la somme sur une colonne
	    $ find . -name "A198549*" -exec grep "3040520446855" {} \; \
	      | awk '{CPT=CPT+substr($0,44,6);} END { print CPT}'

	- Faire la somme des valeurs contenues dans un fichier
	    $ awk '{ s+= $1 } END { print s }' fichier

    - Identifier les mails dont la transmission a été différée (deffered)
        clear; \
        cat /var/log/postfix/postfix-in.1 \
            | egrep '^Nov 14' \
            | awk '/status=deferred/{EMAIL=$7;sub("^.*\<","",EMAIL);sub("\>,","",EMAIL);if (EMAIL!="postmaster@batz.logilec.fr") print substr($6,1,9),EMAIL}' \
            | uniq > /tmp/list.txt; \
        for ID in `cat /tmp/list.txt`; do \
            if [ -z "`echo $ID | grep '@'`" ] ; then \
                echo $ID; \
                grep $ID /var/log/postfix/postfix-in.1 \
                    | awk '/from=/{EMAIL=$7;sub("^.*\<","",EMAIL);sub("\>,","",EMAIL);print "    FROM="EMAIL}' \
                    | uniq; \
            else \
                echo "    TO="$ID; \
            fi; \
        done; \
        rm -f /tmp/list.txt

            C174E7DAB
                FROM=Annie.Thevenet@unilever.com
                TO=edi@logilec.fr
            3FF8B7E0A
                FROM=Peggy.Landrain@scamark.fr
                TO=exploit@logilec.fr
            C174E7DAB
                FROM=Annie.Thevenet@unilever.com
                TO=edi@logilec.fr
            3FF8B7E0A
                FROM=Peggy.Landrain@scamark.fr
                TO=logistique@logilec.fr
            811B27E0D
                FROM=papoosesuu@correo-electronico.com
                TO=orn@logilec.fr

        awk '/C174E7DAB|3FF8B7E0A|45B8D7E0B|C40C37E11/{print $0}' /var/log/postfix/postfix-in.1 | grep "status=sent"

Liens

applications/outils_systeme/awk.txt · Dernière modification: 2014/03/12 16:30 (modification externe)

Outils de la page