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:
  1. BEGIN ... und END ... sind optional und werden vor oder nach der Verarbeitung von awk-Eingabezeilen ausgeführt.
  2. Wenn für Bedingung in der Zeile awk die Bedingung <condN> Fleisch ist, wird der zugehörige <program actions> -Block ausgeführt.
  3. {<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 Als FS .
  • IGNORECASE : beeinflusst FS und RS, wenn reguläre Ausdrücke IGNORECASE ;

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow