awk Tutorial
Erste Schritte mit awk
Suche…
Bemerkungen
Der Name AWK stammt von den letzten Initialen seiner Schöpfer Alfred V. Aho, Peter J. Weinberger und
Brian W. Kernighan.
Ressourcen
Versionen
| Name | Erste Version | Ausführung | Veröffentlichungsdatum |
|---|---|---|---|
| POSIX awk | 1992 | IEEE Std 1003.1, Ausgabe 2013 | 2013-04-19 |
| Ein wahrer Awk oder Nawk oder BWK-Axt | 198X | - | 2012-12-20 |
| GNU awk oder gawk | 1986 | 4.1.3 | 2015-05-19 |
Hallo Welt
Das Hello-World-Beispiel ist so einfach wie:
awk 'BEGIN {print "Hello world"}'
Das grundlegendste awk Programm besteht aus einem wahren Wert (normalerweise 1 ) und awk dass awk seine Eingabe awk :
$ date | awk '1'
Mon Jul 25 11:12:05 CEST 2016
Da "Hallo Welt" auch ein echter Wert ist, könnte man auch sagen:
$ date | awk '"hello world"'
Mon Jul 25 11:12:05 CEST 2016
Ihre Absicht wird jedoch viel deutlicher, wenn Sie schreiben
$ date | awk '{print}'
Mon Jul 25 11:12:05 CEST 2016
stattdessen.
So führen Sie AWK-Programme aus
Wenn das Programm kurz ist, können Sie es in den Befehl einschließen, der awk ausführt:
awk -F: '{print $1, $2}' /etc/passwd
In diesem Beispiel empfehlen wir awk, den Befehlszeilenschalter -F: : als Begrenzungszeichen für Eingabefelder zu verwenden. Ist das gleiche wie
awk 'BEGIN{FS=":"}{print $1,$2}' file
Alternativ können wir den gesamten awk-Code in einer awk-Datei speichern und dieses awk-Programm folgendermaßen aufrufen:
awk -f 'program.awk' input-file1 input-file2 ...
program.awk kann ein beliebiges mehrzeiliges Programm sein, dh:
# file print_fields.awk
BEGIN {print "this is a header"; FS=":"}
{print $1, $2}
END {print "that was it"}
Und dann laufen Sie mit:
awk -f print_fields.awk /etc/passwd #-f advises awk which program file to load
Oder allgemeiner:
awk -f program-file input-file1 input-file2 ...
Der Vorteil des Programms in einer separaten Datei besteht darin, dass Sie das Programm mit der richtigen Identifikation schreiben können, um Sinn zu machen
AWK durch Beispiele
AWK ist eine String-Manipulationssprache, die hauptsächlich in UNIX-Systemen verwendet wird. Die Idee hinter AWK war es, eine vielseitige Sprache für die Arbeit an Dateien zu erstellen, die nicht zu komplex war, um sie zu verstehen.
AWK hat einige andere Varianten, aber das Hauptkonzept ist das gleiche, nur mit zusätzlichen Funktionen. Diese anderen Varianten sind NAWK und GAWK. GAWK enthält alle Funktionen von beiden, während NAWK einen Schritt über AWK liegt, wenn Sie möchten.
Der einfachste Weg, an AWK zu denken, besteht darin, dass es zwei Hauptteile hat. Das Muster und die Aktion.
Wahrscheinlich das einfachste Beispiel für AWK: (Siehe auch: Hello World)
BEGIN {print "START"}
{print }
END {print "STOP" }
Hier sind die Schlüsselwörter BEGIN und END das Muster, während sich die Aktion in {} befindet. Dieses Beispiel wäre unbrauchbar, aber es würde nur geringfügige Änderungen erfordern, um daraus eine nützliche Funktion zu machen.
BEGIN {print "File\tAuthor"}
{print $8, "\t", $3}
END {print " - DONE - "}
Hier steht \t für ein Tab-Zeichen und wird verwendet, um die Grenzen der Ausgabezeilen auszugleichen. $ 8 und $ 3 ähneln der Verwendung in Shell Scripts , verwenden jedoch anstelle des 3. und 8. Arguments die 3. und 8. Spalte der Eingabezeile.
Dieses Beispiel würde also Folgendes drucken: File Author in der obersten Zeile, während die zweite Zeile mit den Dateipfaden zu tun hat. $ 8 ist der Name der Datei, $ 3 ist der Besitzer (Wenn Sie den Verzeichnispfad betrachten, wird dies klarer). Schließlich würde die untere Zeile wie erwartet gedruckt werden - DONE -
Das oben genannte Beispiel bezieht sich auf http://www.grymoire.com/Unix/Awk.html
Referenzdatei
coins.txt von Greg Goebel:
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
silver 10 1981 USA ingot
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
silver 1 1986 USA Liberty dollar
gold 0.25 1986 USA Liberty 5-dollar piece
silver 0.5 1986 USA Liberty 50-cent piece
silver 1 1987 USA Constitution dollar
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
Minimale Theorie
Allgemeiner awk Einliner:
awk <awk program> <file>
oder:
<shell-command> | awk <awk program>
<shell-command> und <file> werden als awk-Eingabe adressiert.
<awk program> ist ein Code, der dieser Vorlage folgt (einfache, nicht doppelte, Anführungszeichen):
'BEGIN {<init actions>};
<cond1> {<program actions>};
<cond2> {<program actions>};
...
END {<final actions>}'
woher:
-
<condX>Bedingung<condX>ist meistens ein regulärer Ausdruck/re/, der mit den awk-Eingabezeilen abgeglichen werden soll. -
<* actions>sind Anweisungsfolgen , ähnlich wie Shell-Befehle, die mit C-artigen Konstrukten ausgestattet sind.
`` wird nach folgenden Regeln verarbeitet:
-
BEGIN ...undEND ...sind optional und werden vor oder nach der Verarbeitung von awk-Eingabezeilen ausgeführt. - Wenn für Bedingung in der Zeile awk die Bedingung
<condN>Fleisch ist, wird der zugehörige<program actions>-Block ausgeführt. -
{<program actions>}standardmäßig auf{print $0}.
Bedingungen können mit logischen Standardoperatoren kombiniert werden:
/gold/ || /USA/ && !/1986/
wobei && Vorrang vor || ;
Die print . print item1 item2 Anweisung print item1 item2 druckt Elemente auf STDOUT.
Elemente können Variablen ( X , $0 ), Zeichenfolgen ("Hallo") oder Zahlen sein.
item1, item2 werden mit dem Wert der OFS Variablen item1, item2 .
item1 item2 sind justapoxed ! Verwenden Sie item1 " " item2 für Leerzeichen oder printf für weitere Funktionen.
Variablen benötigen kein $ , dh: print myVar;
Die folgenden speziellen Variablen sind in awk eingebaut:
-
FS: dient als Feldtrennzeichen zum Aufteilen von awk-Eingabezeilen in Felder. Ich kann ein einzelnes Zeichen sein,FS="c"; eine Nullzeichenfolge,FS=""(dann wird jedes einzelne Zeichen zu einem separaten Feld); ein regulärer Ausdruck ohne Schrägstriche,FS="re";FS=" "steht für Leerzeichen und Tabulatoren und ist der Standardwert. -
NF: die Anzahl der zu lesenden Felder; -
$1,$2, ...: 1. Feld, 2. Feld. usw. der aktuellen Eingangsleitung, -
$0: aktuelle Eingabezeile; -
NR: Aktuelle Put-Zeilennummer. -
OFS: Zeichenfolge zum Sortieren von Feldern beim Drucken. -
ORS: Ausgabe-Trennzeichen, standardmäßig ein Zeilenvorschub. -
RS: Trennzeichen für Eingabezeile (Datensatz). Standardeinstellung für Zeilenvorschub AlsFS. -
IGNORECASE: beeinflusst FS und RS, wenn reguläre AusdrückeIGNORECASE;
Beispiele
Filtern Sie Zeilen nach Regexp gold und zählen Sie sie:
# awk 'BEGIN {print "Coins"} /gold/{i++; print $0} END {print i " lines out of " NR}' coins.txt
Coins
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
gold 0.25 1986 USA Liberty 5-dollar piece
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
9 lines out of 13
Standardmäßige print $0 Aktion und -Kondition basierend auf der internen Variablen- NR :
# awk 'BEGIN {print "First 3 coins"} NR<4' coins.txt
First 3 coins
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
silver 10 1981 USA ingot
Formatierung mit C-Stil `printf`: # awk '{printf ("%s \t %3.2f\n", $1, $2)}' coins.txt
gold 1.00
gold 1.00
silver 10.00
gold 1.00
gold 1.00
gold 0.50
gold 0.10
silver 1.00
gold 0.25
silver 0.50
silver 1.00
gold 0.25
gold 1.00
Bedingungsbeispiele
awk 'NR % 6' # prints all lines except those divisible by 6
awk 'NR > 5' # prints from line 6 onwards (like tail -n +6, or sed '1,5d')
awk '$2 == "foo"' # prints lines where the second field is "foo"
awk '$2 ~ /re/' # prints lines where the 2nd field mateches the regex /re/
awk 'NF >= 6' # prints lines with 6 or more fields
awk '/foo/ && !/bar/' # prints lines that match /foo/ but not /bar/
awk '/foo/ || /bar/' # prints lines that match /foo/ or /bar/ (like grep -e 'foo' -e 'bar')
awk '/foo/,/bar/' # prints from line matching /foo/ to line matching /bar/, inclusive
awk 'NF' # prints only nonempty lines (or: removes empty lines, where NF==0)
awk 'NF--' # removes last field and prints the line
Durch das Hinzufügen einer Aktion {...} kann ein bestimmtes Feld anstelle der gesamten Zeile gedruckt werden, z.
awk '$2 ~ /re/{print $3 " " $4}'
gibt das dritte und vierte Zeilenfeld aus, wobei das zweite Feld den Regex / re / zusammenfügt.
Einige Stringfunktionen
Funktion substr() :
# awk '{print substr($3,3) " " substr($4,1,3)}'
86 USA
08 Aus
81 USA
84 Swi
79 RSA
81 RSA
86 PRC
86 USA
86 USA
86 USA
87 USA
87 USA
88 Can
match(s, r [, arr]) gibt die Position in s , wo die regulären Ausdruck r auftritt , und setzt die Werte von RSTART und RLENGTH . Wenn das Argument arr ist, wird das Array arr in dem Elemente auf den übereinstimmenden, in Klammern stehenden Teilausdruck gesetzt werden. Die 0-ten Elementübereinstimmungen von arr auf die gesamte Regex-Übereinstimmung gesetzt. Auch die Ausdrücke arr[n, "start"] und arr[n, "length"] geben die Startposition und die Länge jedes übereinstimmenden Teilstrings an.
Weitere Stringfunktionen:
sub(/regexp/, "newstring"[, target])
gsub(/regexp/, "newstring"[, target])
toupper("string")
tolower("string")
Aussagen
Eine einfache Aussage ist oft eine der folgenden:
variable = expression
print [ expression-list ]
printf format [ , expression-list ]
next # skip remaining patterns on this input line
exit # skip the rest of the input
Wenn stat1 und stat2 Anweisungen sind, sind auch die folgenden Anweisungen:
{stat}
{stat1; stat2}
{stat1
stat2}
if ( conditional ) statement [ else statement ]
Die folgenden Standard-C-ähnlichen Konstrukte sind Anweisungen:
if ( conditional ) statement [ else statement ]
while ( conditional ) statement
for ( expression ; conditional ; expression ) statement
break # usual C meaning
continue # usual C meaning
Eine Schleife im C-Stil zum Drucken des variablen Längenbeschreibungselements, beginnend mit Feld 4:
# awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}' coins.txt
USA American Eagle
Austria-Hungary Franz Josef 100 Korona
USA ingot
Switzerland ingot
RSA Krugerrand
RSA Krugerrand
PRC Panda
USA Liberty dollar
USA Liberty 5-dollar piece
USA Liberty 50-cent piece
USA Constitution dollar
USA Constitution 5-dollar piece
Canada Maple Leaf
Beachten Sie, dass i auf 0 initialisiert wird.
Wenn Bedingungen und Berechnungen auf Nonnenfelder angewandt werden:
# awk '/gold/ {if($3<1980) print $0 "$" 425*$2}' coins.txt
gold 1 1908 Austria-Hungary Franz Josef 100 Korona $425
gold 1 1979 RSA Krugerrand $425
AWK ausführbares Skript
#!/usr/bin/gawk -f
# This is a comment
(pattern) {action}
...
Shell-Variablen übergeben
# var="hello"
# awk -v x="$var" 'BEGIN {print x}'
hello