Question

Je trouve AWK vraiment utile. Voici une ligne que j'ai créée pour manipuler des données.

ls | awk '{ print "awk " "'"'"'"  " {print $1,$2,$3} " "'"'"'"  " " $1 ".old_ext > " $1    ".new_ext"  }' > file.csh

J'ai utilisé cette clé AWK pour créer un fichier de script qui renommerait certains fichiers et n'imprimerait que des colonnes sélectives. Quelqu'un sait un meilleur moyen de faire ça? Qu'est-ce que tu préfères AWK one liners ou manipulations intelligentes?

Était-ce utile?

La solution

Le livre AWK regorge d'excellents exemples. Celles-ci étaient habituellement téléchargées à partir de la page Web de Kernighan . (404s maintenant).

Autres conseils

Vous pouvez trouver plusieurs lignées uniques ici .

J'utilise ceci:

df -m | awk '{p+=$3}; END {print p}'

Pour additionner tout l'espace disque utilisé sur un système sur plusieurs systèmes de fichiers.

Il y a de nombreuses années, j'ai écrit un script de queue dans awk:

#!/usr/bin/awk -f
BEGIN {
  lines=10
}

{
  high = NR % lines + 1
  a[high] = <*>
}

END {
  for (i = 0; i < lines; i++) {
    n = (i + high) % lines + 1
    if (n in a) {
      print a[n]
    }
  }
}

C'est idiot, je sais, mais c'est ce que awk vous fait. C'est juste très amusant de jouer avec.

Henry Spencer a écrit une assez bonne implémentation de nroff on awk. Il l'a appelé "awf". Il a également affirmé que si Larry Wall avait su à quel point awk était puissant, il n'aurait pas eu besoin d'inventer Perl.

Voici quelques astuces que j'utilisais régulièrement ... notez que vous pouvez utiliser 1 $, 2 $, etc. pour sortir la colonne de votre choix. Donc, pour manipuler un tas de fichiers, voici une commande stupide que vous pourriez utiliser à la place de mv ...

ls -1 *.mp3 | awk '{printf("mv %s newDir/%s\n",$1,$1)}' | /bin/sh

Ou si vous envisagez un ensemble de processus, peut-être ...

ps -ef | grep -v username | awk '{printf("kill -9 %s\n",$2)}' | /bin/sh

Assez trivial, mais vous pouvez voir comment cela vous aiderait. =) La plupart des choses que j’avais l'habitude de faire peuvent être utilisées avec xargs, mais bon, qui a besoin de nouvelles commandes fantômes?

J'utilise beaucoup ce script pour éditer PATH et les variables d'environnement de type chemin. Utilisation:

export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/other/old/bin)

Cette commande ajoute / new / bin et / other / bin devant PATH, supprime les deux / old / bin et / other / old / bin de PATH (le cas échéant - pas d'erreur en cas d'absence) et supprime les entrées de répertoire dupliquées. sur le chemin.

:   "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp <*>quot;
#
#   Print minimal version of $PATH, possibly removing some items

case $# in
0)  chop=""; path=${PATH:?};;
1)  chop=""; path=$1;;
2)  chop=$2; path=$1;;
*)  echo "Usage: `basename <*> .sh` [$PATH [remove:list]]" >&2
    exit 1;;
esac

# Beware of the quotes in the assignment to chop!
echo "$path" |
${AWK:-awk} -F: '#
BEGIN       {       # Sort out which path components to omit
                    chop="'"$chop"'";
                    if (chop != "") nr = split(chop, remove); else nr = 0;
                    for (i = 1; i <= nr; i++)
                            omit[remove[i]] = 1;
            }
{
    for (i = 1; i <= NF; i++)
    {
            x=$i;
            if (x == "") x = ".";
            if (omit[x] == 0 && path[x]++ == 0)
            {
                    output = output pad x;
                    pad = ":";
            }
    }
    print output;
}'

Compter la mémoire utilisée par httpd

ps -ylC httpd | awk '/[0-9]/ {SUM += $8} END {print SUM/1024}'

Ou tout autre processus en remplaçant httpd. Division par 1024 pour obtenir une sortie en Mo.

J'ai réussi à créer un émulateur de commande d'arborescence DOS pour UNIX (recherche + awk):

find . -type d -print 2>/dev/null|awk '{for (i=1;i< NF;i++)printf("%"length($i)"s","|");gsub(/[^\/]*\//,"--",<*>);print $NF}'  FS='/'

Imprimer des lignes entre deux motifs:

awk '/END/{flag=0}flag;/START/{flag=1}' inputFile

Explication détaillée: http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/

Un couple de favoris, essentiellement indépendants l'un de l'autre. Lire comme 2 suggestions différentes et non liées.

Identifier facilement les numéros de colonne

:

Pour ceux qui utilisent fréquemment awk, comme je le fais pour l'analyse de journaux au travail, je me trouve souvent dans l'obligation de connaître les numéros de colonne d'un fichier. Donc, si j’analyse, par exemple, les fichiers d’accès Apache (des exemples peuvent être trouvés ici ) J'exécute le script ci-dessous sur le fichier:

NR == 1 {
        for (i = 1 ; i <= NF ; i++)
                {
                print i "\t" $i
                }
        }
NR > 1  {
        exit
        }

Je l'appelle généralement "cn.awk", pour "nombre de colonnes". Créatif, hein? Quoi qu’il en soit, la sortie ressemble à:

1   64.242.88.10
2   -
3   -
4   [07/Mar/2004:16:05:49
5   -0800]
6   "GET
7   /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables
8   HTTP/1.1"
9   401
10  12846

Très facile de dire quoi. Je l’alias généralement sur mes serveurs et je l’ai partout.

Référencement des champs par nom

Supposons maintenant que votre fichier comporte une ligne d’en-tête et que vous préférez utiliser ces noms plutôt que les numéros de champs. Cela vous permet de le faire:

NR == 1 {
    for (i = 1 ; i <= NF ; i++)
        {
        field[$i] = i
        }
    }

Maintenant, supposons que j'ai cette rangée d'en-tête ...

métrique, heure, valeur, emplacement, état_travail, demande http

... et j'aimerais résumer la colonne val . Au lieu de faire référence à 3 $, je peux le nommer:

NR > 1  {
    SUM += $field["val"]
    }

Le principal avantage est de rendre le script beaucoup plus lisible.

L'impression de champs est l'une des premières choses mentionnées dans la plupart des tutoriels AWK.

awk '{print $1,$3}' file

Moins connu mais tout aussi utile, exclure des champs est également possible:

awk '{$1=$3=""}1' file
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top