Sök…


Anmärkningar

Namnet AWK kommer från de sista initialerna till skaparna Alfred V. Aho, Peter J. Weinberger och
Brian W. Kernighan.

Resurser

versioner

namn Första versionen Version Utgivningsdatum
POSIX awk 1992 IEEE Std 1003.1, 2013-upplagan 2013/04/19
En True Awk eller nawk eller BWK awk 198X - 2012/12/20
GNU awk eller gawk 1986 4.1.3 2015/05/19

Hej världen

Hello world-exemplet är lika enkelt som:

awk 'BEGIN {print "Hello world"}'

Det mest grundläggande awk programmet består av ett verkligt värde (vanligtvis 1 ) och får awk eko till dess inmatning:

$ date | awk '1'
Mon Jul 25 11:12:05 CEST 2016

Eftersom "hejvärld" också är ett verkligt värde, kan du också säga:

$ date | awk '"hello world"'
Mon Jul 25 11:12:05 CEST 2016

Men din avsikt blir mycket tydligare om du skriver

$ date | awk '{print}'
Mon Jul 25 11:12:05 CEST 2016

istället.

Hur man kör AWK-program

Om programmet är kort kan du inkludera det i kommandot som kör awk:

awk -F: '{print $1, $2}' /etc/passwd

I det här exemplet med hjälp av kommandoradsväxlare -F: vi råder awk att använda: som ingångsfält avgränsar. Är är samma som

awk 'BEGIN{FS=":"}{print $1,$2}' file

Alternativt kan vi spara hela awk-koden i en awk-fil och kalla den här awk-programmen så här:

awk -f 'program.awk' input-file1 input-file2 ...

program.awk kan vara vilket multiline-program, det vill säga:

# file print_fields.awk
BEGIN {print "this is a header"; FS=":"}
{print $1, $2}
END {print "that was it"}

Och kör sedan det med:

awk -f print_fields.awk /etc/passwd   #-f advises awk which program file to load

Eller mer generellt:

awk -f program-file input-file1 input-file2 ...

Fördelen med att ha programmet i en separat fil är att du kan skriva programmet med korrekt identitet för att vara meningsfullt, du kan inkludera kommentarer med #, etc

AWK med exempel

AWK är strängmanipuleringsspråk, som till stor del används i UNIX-system. Tanken bakom AWK var att skapa ett mångsidigt språk att använda när man arbetar med filer, vilket inte var för komplicerat för att förstå.

AWK har några andra varianter, men huvudkonceptet är detsamma, bara med ytterligare funktioner. Dessa andra varianter är NAWK och GAWK. GAWK innehåller alla funktioner i båda, medan NAWK är ett steg ovanför AWK, om du vill.

Det enklaste sättet att tänka på AWK är att tänka på att den har två huvuddelar. Mönstret och handlingen.

Förmodligen det mest grundläggande exemplet på AWK: (Se även: Hello World)

BEGIN {print "START"}
      {print        }
END   {print "STOP" }

Här är nyckelorden BEGIN och END mönstret, medan handlingen är inne i {}. Det här exemplet skulle vara värdelöst, men det tar bara mindre ändringar för att faktiskt göra detta till en användbar funktion.

BEGIN {print "File\tAuthor"}
      {print $8, "\t", $3}
END {print " - DONE - "}

Här representerar \t ett tabulatortecken och används för att jämna upp utgångsgränserna. $ 8 och $ 3 liknar användningen som visas i Shell Scripts , men istället för att använda den tredje och åttonde argumenten använder den den tredje och den åttonde kolumnen på inmatningsraden.

Så det här exemplet skulle skriva ut: Filförfattare på den översta raden, medan den andra raden har att göra med filvägarna. $ 8 är namnet på filen, $ 3 är ägaren (När man tittar på katalogvägen blir det mer tydligt). Slutligen kommer den nedersta raden att skriva ut, som du kan förvänta dig - DONE -

Kredit för ovanstående exempel går till http://www.grymoire.com/Unix/Awk.html

Referensfil

coins.txt från 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

Minimal teori

Allmänt awk one-liner:

awk <awk program> <file>

eller:

<shell-command> | awk <awk program> 

<shell-command> och <file> adresseras som awk-inmatning .

<awk program> är en kod som följer den här mallen (enstaka, inte dubbla, citat):

'BEGIN   {<init actions>};
 <cond1> {<program actions>};
 <cond2> {<program actions>};
 ...
 END  {<final actions>}'

var:

  • <condX> är oftast ett regelbundet uttryck /re/ , som ska matchas med awk-inmatade linjer;
  • <* actions> är sekvenser av påståenden , liknar skalkommandon, utrustade med C-liknande konstruktioner.

`` behandlas enligt följande regler:
  1. BEGIN ... och END ... är valfria och körs före eller efter bearbetning av awk-inmatningslinjer.
  2. För varje rad i awk-ingången, om villkoret <condN> är kött, <condN> det relaterade <program actions> blocket.
  3. {<program actions>} standard {print $0} .

Villkor kan kombineras med logiska standardoperatörer:

    /gold/ || /USA/ && !/1986/

där && har företräde framför || ;

print . print item1 item2 uttalande skriver ut objekt på STDOUT.
Objekt kan vara variabler ( X , $0 ), strängar ("hej") eller siffror.
item1, item2 med värdet på OFS variabeln;
item1 item2 är justapoxed ! Använd item1 " " item2 för mellanslag eller printf för fler funktioner.

Variabler behöver inte $ , dvs: print myVar;
Följande specialvariabler är inbyggda i awk:

  • FS : fungerar som fältavskiljare för att dela awk inmatningslinjer i fält. Jag kan vara en enda karaktär, FS="c" ; en nollsträng, FS="" (då blir varje enskilt tecken ett separat fält); ett regelbundet uttryck utan snedstreck, FS="re" ; FS=" " står för körningar av mellanslag och flikar och är standardvärde.
  • NF : antalet fält att läsa;
  • $1 , $2 , ...: 1: a fältet, 2: a fältet. etc. för den aktuella ingångslinjen,
  • $0 : aktuell inmatningsrad;
  • NR : aktuellt radnummer.
  • OFS : sträng för att sortera fält vid utskrift.
  • ORS : utmatar inspelningsavskiljare, som standard en ny linje.
  • RS : Inmatningslinje (inspelning) separator. Standardvärde för ny linje. Ställ in som FS .
  • IGNORECASE : påverkar FS och RS när regelbundna uttryck;

exempel

Filtrera linjer efter regexp gold och räkna dem:

# 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

Standardutskrift print $0 åtgärd och villkor baserat på intern awk-variabel 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
Formatera med 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

Exempel på skick

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

Genom att lägga till en åtgärd {...} kan man skriva ut ett specifikt fält i stället för hela linjen, t.ex.

awk '$2 ~ /re/{print $3 " " $4}'

skriver ut det tredje och fjärde linjefältet där det andra fältet matematikerar regex / re /.

Vissa strängfunktioner

substr() -funktion:

# 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]) returnerar positionen i s där regex r sker och ställer in värdena på RSTART och RLENGTH . Om argumentet arr tillhandahålls returnerar det array- arr där elementen är inställda på den matchade parenteserade subexpressionen. Det 0: e elementet matchningar av arr är inställt på hela regex-matchen. Även uttryck arr[n, "start"] och arr[n, "length"] ger startpositionen och längden på varje matchande substring.

Fler strängfunktioner:

sub(/regexp/, "newstring"[, target])
gsub(/regexp/, "newstring"[, target])
toupper("string")
tolower("string")

uttalanden

Ett enkelt uttalande är ofta något av följande:

variable = expression 
print [ expression-list ] 
printf format [ , expression-list ] 
next # skip remaining patterns on this input line
exit # skip the rest of the input

Om stat1 och stat2 är uttalanden är följande också uttalanden:

{stat}

{stat1;  stat2}

{stat1 
stat2}

if ( conditional ) statement [ else statement ]

Följande standard C-liknande är konstruktioner är uttalanden:

if ( conditional ) statement [ else statement ]
while ( conditional ) statement
for ( expression ; conditional ; expression ) statement
break    # usual C meaning 
continue # usual C meaning 

En C-stilslinga för att skriva ut beskrivningselementet med variabel längd, börjar med fält 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

Observera att i initialiseras till 0.

Om förhållanden och beräkningar tillämpas på fälten:

# 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 körbart skript

#!/usr/bin/gawk -f
# This is a comment
(pattern) {action}
...

Passande skalvariabler

# var="hello"
# awk -v x="$var" 'BEGIN {print x}'
hello


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow