Frage

Ich finde AWK wirklich nützlich.Hier ist ein Einzeiler, das ich zusammengestellt habe, um Daten zu verändern.

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

Ich habe dieses AWK, um eine Skript-Datei, die umbenennen würde einige Dateien und nur-drucken Sie die selektive Spalten.Wer weiß einen besseren Weg, dies zu tun?Was sind Sie beste AWK-Einzeiler oder geschickte Manipulationen?

War es hilfreich?

Lösung

Die AWK Buch ist voll von großen Beispiele. Sie verwendeten zum Herunterladen hinterlegt werden von Kernighan Homepage (404s jetzt).

Andere Tipps

Sie können mehr nett finden Liner hier .

Ich benutze diese:

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

Um alle Speicherplatz auf einem System über Dateisysteme verwendet insgesamt.

Vor vielen Jahren schrieb ich einen Schwanz Skript in awk:

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

{
  high = NR % lines + 1
  a[high] = $0
}

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

Es ist dumm, ich weiß, aber das ist, was awk Sie tut. Es ist nur sehr Spaß mit ihm zu spielen.

Henry Spencer schrieb eine ziemlich gute Umsetzung von nroff auf awk. Er nannte es „awf“. Er behauptete auch, dass, wenn Larry Wall gewusst hätte, wie mächtig awk war, würde er nicht perl zu erfinden benötigt haben.

Hier ein paar awks, die ich regelmäßig zu verwenden, verwendet ... beachten Sie, dass Sie $ 1, $ 2 usw. verwenden können die Spalte Sie wollen raus. Also, eine Reihe von Dateien für die Manipulation, zum Beispiel hier ist ein dummer Befehl Sie statt mv verwenden könnten ...

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

Oder wenn Sie bei einer Reihe von Prozessen suchen vielleicht ...

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

Pretty trivial, aber man kann sehen, wie das würden Sie recht weit kommen. =) Die meisten Sachen, die ich zu tun pflegen Sie xargs für, aber hey verwenden können, wer braucht sich neumodische Befehle?

Ich benutze dieses Skript eine Menge für die Bearbeitung von PATH und mit dem Weg wie Umgebungsvariablen. Verbrauch:

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

Mit diesem Befehl / neu / sind und / Sonstiges / ist vor PATH, entfernt sowohl / alt / sind und / Sonstiges / alt / ist von PATH (falls vorhanden - kein Fehler, wenn nicht vorhanden), und doppelte Verzeichniseinträge entfernt auf dem Weg.

:   "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp $"
#
#   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 $0 .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;
}'

Count-Speicher verwendet von httpd

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

oder ein anderes Verfahren durch httpd zu ersetzen. 1024 Dividing Ausgang in MB zu erhalten.

ich es geschafft, ein DOS-Baum Befehl Emulator für UNIX zu bauen (+ awk finden):

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

Druckleitungen zwischen zwei Mustern:

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

Ausführliche Erläuterung: http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/

Ein paar Favoriten, die im wesentlichen nichts miteinander zu tun.Lesen Sie, wie 2 verschiedene, unverbundene Vorschläge.

Die Ermittlung Spalte Die Zahlen Leicht

:

Für diejenigen, die verwenden awk Häufig, wie ich für Protokoll-Analyse-bei der Arbeit, ich finde mich oft benötigen, um herauszufinden, was die Spalte Nummern stehen für eine Datei.Also, wenn ich bin zu analysieren, zu sagen, Apache access-Dateien (einige Proben gefunden werden hier) Führe ich das Skript unten in der Datei:

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

Ich in der Regel nennen es "cn.awk", für " c'olumn 'n'umbers.Kreativ, nicht wahr?Sowieso, die Ausgabe sieht wie folgt aus:

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

Sehr einfach zu sagen, was was ist.Ich in der Regel alias auf meinem Server und habe es überall.


Verweisen auf Felder mit Namen

Nehmen wir nun an, Ihre Datei hat eine Kopfzeile, die Sie lieber verwenden diese Namen, anstelle des Feldes zahlen.Dies ermöglicht es Ihnen, dies zu tun:

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

Nehmen wir nun an, ich habe diese header-Zeile...

metric,time,val,location,http_status,http_request

...und ich möchte, um die Summe der val Spalte.Statt auf $3, kann ich finden es durch den Namen:

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

Der Hauptvorteil ist, dass die Skript viel besser lesbar.

Druckfelder ist eines der ersten Dinge in den meisten AWK Tutorials erwähnt.

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

Weniger bekannt, aber ebenso nützlich ist, mit Ausnahme von Bereichen, die auch möglich ist:

awk '{$1=$3=""}1' file
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top