comando awk Linux
comando awk Linux
AWK è un file di testo di elaborazione del linguaggio, analisi del testo è uno strumento potente.
AWK è stato chiamato perché ci sono voluti tre fondatori Alfred Aho, Peter Weinberger, e Brian Kernighan del cognome del primo carattere.
grammatica
awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s)
Opzioni Parametro Descrizione:
- -F Fs o fs --field-separatore
Specifica di un file di input via di separazione, FS è una stringa o un'espressione regolare, come ad esempio F:. - -v var = valore o --asign var = value
Assegnare una variabile definita dall'utente. - scripfile -f o --file scriptfile
comando awk letta da un file di script. - -mf nnn e -mr nnn
il valore nnn di limiti intrinseci, il numero massimo di blocchi nnn limiti -mf assegnati; opzione limita il numero massimo -Mr record. Queste due caratteristiche sono la versione dei Bell Labs di estensioni awk nel awk norma non si applica. - -W Compact o --compat, -W tradizionale o --traditional
L'esecuzione in modalità di compatibilità awk. Così gawk comportamento ed esattamente la stessa awk standard awk tutte le estensioni vengono ignorati. - -W Copyleft o --copyleft, diritti d'autore o -W --copyright
Stampa le informazioni sul copyright breve. - Aiuto -W o --help, utilizzo -W o --usage
Stampare una breve descrizione di tutte le opzioni di awk e ogni opzione. - -W Lint o --lint
avvertimenti di stampa non alla struttura della tradizionale porting di Unix. - -W Lint-old o --lint-old
La stampa non può essere trapiantato a avvertimento struttura della piattaforma tradizionale UNIX. - -W Posix
Attivare la modalità di compatibilità. Con le seguenti restrizioni, non riconosce: / x, tasto funzione, func, sequenze di escape, e quando FS è uno spazio, la nuova linea come separatore di campo, gli operatori ** e ** = non può sostituire ^ e ^ =; fflush valido. - -W Re-intervallo o --re-inerval
Lasciare le espressioni di intervallo in uso regolare, di riferimento (grep nelle classi di caratteri POSIX), come ad esempio espressioni fra parentesi quadre [[: alpha:]]. - -W Sorgente del programma-testo o --source programma di testo
Utilizzare il programma-testo come codice sorgente, può essere miscelato con il comando -f. - -W Versione o --version
Stampa versione bug comunicazione delle informazioni.
Uso di base
testo log.txt recita come segue:
2 this is a test 3 Are you like awk This's a test 10 There are orange,apple,mongo
Utilizzare un:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
esempio:
# 每行按空格或TAB分割,输出文本中的1、4项 $ awk '{print $1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo # 格式化输出 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo
Uso II:
awk -F #-F相当于内置变量FS, 指定分割字符
esempio:
# 使用","分割 $ awk -F, '{print $1,$2}' log.txt --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 There are orange apple # 或者使用内建变量 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 There are orange apple # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt --------------------------------------------- 2 this test 3 Are awk This's a 10 There apple
Utilizzare tre:
awk -v # 设置变量
esempio:
$ awk -va=1 '{print $1,$1+a}' log.txt --------------------------------------------- 2 3 3 4 This's 1 10 11 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt --------------------------------------------- 2 3 2s 3 4 3s This's 1 This'ss 10 11 10s
Utilizzare quattro:
awk -f {awk脚本} {文件名}
esempio:
$ awk -f cal.awk log.txt
operatori
operatori | descrizione |
---|---|
= + = - = * = / =% = ^ = ** = | assegnazione |
?: | C espressione condizionale |
|| | logico o |
&& | Logica e |
~ ~! | Far corrispondere l'espressione regolare non corrisponde l'espressione regolare |
<< = >> =! = == | Operatori relazionali |
vuoto | collegamento |
+ - | Addizione, sottrazione |
* / & | Moltiplicazione, divisione e resto |
+ -! | più unario, meno, e negazione logica |
^ *** | elevamento a potenza |
++ - | Aumentato o diminuito, come prefisso o suffisso |
$ | i riferimenti di campo |
in | membri di matrice |
Filtrare la prima colonna della riga è maggiore di 2
$ awk '$1>2' log.txt #命令 #输出 3 Are you like awk This's a test 10 There are orange,apple,mongo
Filtrare la prima colonna della riga 2 eguali
$ awk '$1==2 {print $1,$3}' log.txt #命令 #输出 2 is
Filtrando la prima fila e la seconda colonna è maggiore di 2 colonna uguale a 'Are' di
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令 #输出 3 Are you
Built-in variabili
variabile | descrizione |
---|---|
\ $ N | N-esimo campo del record corrente, separati da FS tra campi |
\ $ 0 | record di input completa |
ARGC | Il numero di parametri da linea di comando |
ARGIND | Posizione sulla riga di comando del file corrente (inizia a contare da 0) |
ARGV | Array contiene gli argomenti della riga di comando |
CONVFMT | ENVIRON ambiente formato variabile array associativo di conversione digitale (il valore predefinito è% .6g) |
ERRNO | Infine, una descrizione errore del sistema |
FIELDWIDTHS | La larghezza dell'elenco di campi (separati da uno spazio) |
FILENAME | il nome del file corrente |
FNR | Con NR, ma relativo al file corrente |
FS | separatore di campo (di default è eventuali spazi) |
IGNORECASE | Se fosse vero, il match case-insensitive |
NF | Il numero di campi nel record corrente |
NR | Il numero corrente di record |
OFMT | formato di output digitale (di default è% .6g) |
OFS | separatore di campo di uscita (il valore predefinito è uno spazio) |
ORS | Il separatore di record di output (il valore predefinito è un ritorno a capo) |
RLENGTH | La lunghezza del match dalla stringa funzione match |
RS | Record di separazione (di default è una nuova linea) |
RSTART | La prima posizione si sposa con la stringa funzione match |
SUBSEP | separatore Array pedice (di default è / 034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt FILENAME ARGC FNR FS NF NR OFS ORS RS --------------------------------------------- log.txt 2 1 5 1 log.txt 2 2 5 2 log.txt 2 3 3 3 log.txt 2 4 4 4 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt FILENAME ARGC FNR FS NF NR OFS ORS RS --------------------------------------------- log.txt 2 1 ' 1 1 log.txt 2 2 ' 1 2 log.txt 2 3 ' 2 3 log.txt 2 4 ' 1 4 # 输出顺序号 NR, 匹配文本行号 $ awk '{print NR,FNR,$1,$2,$3}' log.txt --------------------------------------------- 1 1 2 this is 2 2 3 Are you 3 3 This's a test 4 4 10 There are # 指定输出分割符 $ awk '{print $1,$2,$5}' OFS=" $ " log.txt --------------------------------------------- 2 $ this $ test 3 $ Are $ awk This's $ a $ 10 $ There $
Utilizzare una stringa corrispondente regolare
# 输出第二列包含 "th",并打印第二列与第四列 $ awk '$2 ~ /th/ {print $2,$4}' log.txt --------------------------------------------- this a
~ Uno schema comincia.// È la modalità.
# 输出包含"re" 的行 $ awk '/re/ ' log.txt --------------------------------------------- 3 Are you like awk 10 There are orange,apple,mongo
Ignora caso
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt --------------------------------------------- 2 this is a test This's a test
Modalità negato
$ awk '$2 !~ /th/ {print $2,$4}' log.txt --------------------------------------------- Are like a There orange,apple,mongo $ awk '!/th/ {print $2,$4}' log.txt --------------------------------------------- Are like a There orange,apple,mongo
script awk
A proposito di script awk, dobbiamo prestare attenzione a due parole chiave inizio e fine.
- BEGIN {non è messo prima di eseguire le istruzioni}
- END {Questa è una dichiarazione che ha messo tutte le righe dopo la trasformazione da eseguire}
- {Questo è un processo che ha messo la dichiarazione che deve essere eseguito per ogni riga}
Si supponga che un documento del genere (studente tavolo realizzazione):
$ cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 2537 87 97 95 Bob 2415 40 57 62
Il nostro script awk come segue:
$ cat cal.awk #!/bin/awk -f #运行前 BEGIN { math = 0 english = 0 computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n" printf "---------------------------------------------\n" } #运行中 { math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5 } #运行后 END { printf "---------------------------------------------\n" printf " TOTAL:%10d %8d %8d \n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR }
Guardiamo l'attuazione dei risultati:
$ awk -f cal.awk score.txt NAME NO. MATH ENGLISH COMPUTER TOTAL --------------------------------------------- Marry 2143 78 84 77 239 Jack 2321 66 78 45 189 Tom 2122 48 77 71 196 Mike 2537 87 97 95 279 Bob 2415 40 57 62 159 --------------------------------------------- TOTAL: 319 393 350 AVERAGE: 63.80 78.60 70.00
ulteriori esempi
AWK è un programma ciao mondo:
BEGIN { print "Hello, world!" }
File Size Calcolo
$ ls -l *.txt | awk '{sum+=$6} END {print sum}' -------------------------------------------------- 666581
Per scoprire da un file maggiore della lunghezza della linea 80
awk 'lenght>80' log.txt
Stampa tavola pitagorica
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
Informazioni più dettagliate possono essere visualizzate manuale ufficiale AWK: http://www.gnu.org/software/gawk/manual/gawk.html