awk Handledning
Komma igång med awk
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:
-
BEGIN ...ochEND ...är valfria och körs före eller efter bearbetning av awk-inmatningslinjer. - För varje rad i awk-ingången, om villkoret
<condN>är kött,<condN>det relaterade<program actions>blocket. -
{<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 somFS. -
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