English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Linux awk Befehl

Vollständiges Kommandoerhandbuch für Linux

AWK ist eine Sprache zur Verarbeitung von Textdateien und ein leistungsstarkes Textanalysewerkzeug.

AWK wird so genannt, weil es die Initialen der Familiennamen der drei Gründer Alfred Aho, Peter Weinberger und Brian Kernighan verwendet.

Syntax

awk [Optionen] 'script' var=value file(s)
oder
awk [Optionen] -f scriptfile var=value file(s)

Beschreibung der Optionen:

  • -F fs oder --Feld-Trennzeichen fs
    Bestimme den Trennzeichen für die Eingabedatei, fs ist ein String oder ein reguläres Ausdruck, wie-F:.

  • -v var=value oder --asign var=value
    Weise eine benutzerdefinierte Variable zu.

  • -f scripfile oder --Datei scriptfile
    Lies awk-Befehle aus einer Skriptdatei.

  • -mf nnn und -mr nnn
    Setze eine innere Begrenzung für den Wert nnn,-Die mf-Option begrenzt die maximale Anzahl der zugeteilten Blöcke für nnn;-Die mr-Option begrenzt die maximale Anzahl von Zeilen. Diese Funktionen sind Erweiterungen der Bell-Laboratoriums-Version von awk und gelten nicht für den Standards awk.

  • -W Kompakt oder --Kompatibilität, -W traditionell oder --traditionell
    Führe awk im Kompatibilitätsmodus aus. Daher verhält sich gawk vollständig wie der Standards awk, alle awk-Erweiterungen werden ignoriert.

  • -W Copyleft oder --Copyleft, -W Urheberrecht oder --Urheberrecht
    Drucke kurze Urheberrechtsinformationen.

  • -W hilfe oder --hilfe, -W Verwendung oder --Verwendung
    Druckt alle awk-Optionen und eine kurze Beschreibung jeder Option aus.

  • -W lint oder --lint
    Druckt Warnungen über Strukturen aus, die nicht auf traditionelle Unix-Plattformen portiert werden können.

  • -W lint-alt oder --lint-alt
    Druckt Warnungen über Strukturen aus, die nicht auf traditionelle Unix-Plattformen portiert werden können.

  • -W posix
    Öffnet den Kompatibilitätsmodus. Aber es gibt folgende Einschränkungen, die nicht erkannt werden:/x, Funktionskeyword, func, Escape-Zeichen sowie wenn fs ein Leerzeichen ist, wird eine neue Zeile als Feldtrennzeichen behandelt; Operator**und**= kann nicht ^ und ^= ersetzen; fflush ist ungültig.

  • -W re-Intervall oder --re-Intervall
    Ermöglicht die Verwendung von Intervall-RegulärAusdrücken, siehe (Posix-Zeichenklassen in grep), wie KlammernAusdrücke [[:alpha:]].

  • -W Quellprogramm-oder --Quellprogramm text-text
    Verwendung von program-text als Quellcode, kann mit-f Befehl mischen.

  • -W Version oder --Version
    Druckt die Version der Fehlerberichterstattung aus.

Basisverwendung

Der Inhalt des Textes von log.txt ist wie folgt:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

Verwendungsmethode 1:

awk ''{[Muster] Aktion}' ''{Dateinamen}'' # Zeilenpasswort Aktion awk '''' kann nur mit einfachen Anführungszeichen verwendet werden

示例:

# Jede Zeile wird durch Leerzeichen oder TAB getrennt, um den Text in der1、4Position
 $ awk ''{print $$}1$4}' log.txt
 ---------------------------------------------
 2 a
 3 wie
 Dies ist
 10 orange,apple,mongo
 # Formatierter Ausgabe
 $ awk ''{printf "%"-8s %-10s\n",$$1$4}' log.txt
 ---------------------------------------------
 2        a
 3        wie
 Dies ist
 10       orange,apple,mongo

Verwendungsmethode 2:

awk -F #-F entspricht dem eingebauten Variablen FS, spezifiziert den Trennzeichen

示例:

# Verwenden Sie "," zum Trennen
 $ awk -F ''{print $$1$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There sind orange apple
 # Oder verwenden Sie eingebaute Variablen
 $ awk 'BEGIN{FS=","} {print $$}1$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There sind orange apple
 # Verwenden Sie mehrere Trennzeichen. Zuerst trennen Sie mit einem Leerzeichen, dann trennen Sie die Ergebnisse weiter mit ","
 $ awk -F ''[',]' ''{print $$1$2$5}'     log.txt
 ---------------------------------------------
 2 dieser Test
 3 Es gibt awk
 Dies ist ein
 10 There apple

Verwendungsmethode 3:

awk -v     # Variablen setzen

示例:

 $ awk -va=1 ''{print $$1$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 Dies ist 1
 10 11
 $ awk -va=1 -vb=s ''{print $$1$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 Dies ist 1 This'ss
 10 11 10s

用法四:

awk -f {awk脚本} {文件名}

示例:

 $ awk -f cal.awk log.txt

运算符

运算符描述
= += -= *= /= %= ^= **=赋值
?:C条件表达式
||逻辑或
&&逻辑与
~ 和 !~匹配正则表达式和不匹配正则表达式
< <= > >= != ==关系运算符
空格连接
+ -加,减
* / %乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ --增加或减少,作为前缀或后缀
$字段引用
in数组成员

过滤第一列大于2的行

$ awk '"1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

过滤第一列等于2的行

$ awk '"1==2 {print $1$3}' log.txt    #命令
#输出
2 is

过滤第一列大于2并且第二列等于'Are'的行

$ awk '"1>2 && $2=="Are" {print $1$2$3}' log.txt    #命令
#输出
3 Are you

内建变量

变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出字段分隔符,默认值与输入字段分隔符一致。
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/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 $

使用正则,字符串匹配

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '"2 ~ /th/ {print $2$4}' log.txt
---------------------------------------------
this a

~ 表示模式开始。// 中是模式。

# 输出包含 "re" 的行
$ awk '"/re/ "' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

$ awk 'BEGIN{IGNORECASE=',1} /this/"' log.txt
---------------------------------------------
2 this is a test
This's a test

模式取反

$ 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

awk脚本

关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

  • BEGIN{ 这里面放的是执行前的语句 }

  • END {这里面放的是处理完所有的行后要执行的语句 }

  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ 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

我们的 awk 脚本如下:

$ 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
}
#Ausführung nach}
END {
    printf "---------------------------------------------\n"
    printf "  Gesamt:%10d %8d %8d \n", math, english, computer
    printf "Durchschnitt:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

Lassen Sie uns das Ausgaberesultat betrachten:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   GESAMT
---------------------------------------------
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
---------------------------------------------
  Gesamt:       319      393      350
Durchschnitt:     63.80    78.60    70.00

Einige andere Beispiele

Das Hello World-Programm von AWK ist:

BEGIN { print "Hello, world!" }

Berechnen Sie die Dateigröße

$ ls -l *.txt | awk '{sum+=$5} END {print sum}
--------------------------------------------------
666581

Finden Sie aus der Datei heraus, die Länge größer als 80 Zeilen:

awk 'length>80' log.txt

Drucke die 9-fach Multiplikationstabelle aus

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")'

Vollständiges Kommandoerhandbuch für Linux