Latest web development tutorials

comando awk Linux

comando awk Linux

Linux comando Daquan Linux comando Daquan

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

Linux comando Daquan Linux comando Daquan