Heim  >  Artikel  >  php教程  >  Detaillierte Erklärung des awk-Befehls

Detaillierte Erklärung des awk-Befehls

高洛峰
高洛峰Original
2016-12-12 16:12:161346Durchsuche

简单使用:

awk :对于文件中一行行的独处来执行操作 。

awk -F :'{print $1,$4}'   :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 。 

详细介绍:

AWK命令介绍 

awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息

 

1.   调用awk:

 第一种命令行方式,如:

 awk [-Field-separator] 'commands' input-file(s)

 这里commands是真正的awk命令,[-F域分隔符]是可选的,awk默认使用空格分隔,因此如果要浏览域间有空格的文本,不必指定这个选 项,但如果浏览如passwd文件,此文件各域使用冒号作为分隔符,则必须使用-F选项:   awk -F : 'commands' input-file

第二种,将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它

第三种,将所有awk命令插入一个单独文件,然后调用,如: 

 awk -f awk-script-file input-file

 -f选项指明在文件awk-script-file的awk脚本,input-file是使用awk进行浏览的文件名

 2.   awk脚本:

   awk脚本由各种操作和模式组成,根据分隔符(-F选项),默认为空格,读取的内容依次放置到对应的域中,一行一行记录读取,直到文件尾

 2.1.      模式和动作   

 任何awk语句都是由模式和动作组成,在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态

     模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印 头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk完成文本浏览动作后打印输出文本总数和结 尾状态标志,有动作必须使用{}括起来

     实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码如if和循环looping语句及循环退出等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录

 2.2.     域和记录:

 awk执行时,其浏览标记为$1,$2...$n,这种方法称为域标记。使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域。例如:

 awk '{print $0}' temp.txt > sav.txt

 表示打印所有域并把结果重定向到sav.txt中

 awk '{print $0}' temp.txt|tee sav.txt

  和上例相似,不同的是将在屏幕上显示出来

 awk '{print $1,$4}' temp.txt

    只打印出第1和第4域

 awk 'BEGIN {print "NAME  GRADE\n----"} {print $1"\t"$4}' temp.txt

 表示打信息头,即输入的内容的第一行前加上"NAME  GRADE\n-------------",同时内容以tab分开

 awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp

 同时打印信息头和信息尾

 2.3.     条件操作符:

   =、~匹配正则表达式、!~不匹配正则表达式

     匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四个域包含ASIMA,就打印整条

     精确匹配:awk '$3=="48" {print $0}' temp    只打印第3域等于"48"的记录

     不匹配:  awk '$0 !~ /ASIMA/' temp      打印整条不包含ASIMA的记录

     不等于:  awk '$1 != "asima"' temp

     小于:    awk '{if ($1

     设置大小写: awk '/[Gg]reen/' temp      打印整条包含Green,或者green的记录

     任意字符: awk '$1 ~/^...a/' temp    打印第1域中第四个字符是a的记录,符号’^’代表行首,符合’.’代表任意字符

     或关系匹配: awk '$0~/(abc)|(efg)/' temp   使用|时,语句需要括起来

     AND与关系:  awk '{if ( $1=="a" && $2=="b" ) print $0}' temp

     OR或关系:   awk '{if ($1=="a" || $1=="b") print $0}' temp

 

2.4.     Detaillierte Erklärung des awk-Befehls:

Detaillierte Erklärung des awk-Befehls

Beispiel: awk 'END {print NR}' temp Gibt am Ende die Anzahl der gelesenen Datensätze aus

awk '{print NF, NR, $0} END { print FILENAME}' temp

awk '{if (NR>0 && $4~/Brown/) print $0}' temp Es gibt mindestens einen Datensatz und enthält Brown

Eine weitere Verwendung von NF : echo $PWD |. awk -F/ '{print $NF}' Zeigt den aktuellen Verzeichnisnamen an

2.5 Awk-Operator:

Verwenden Sie grundsätzlich Operatoren in awk Ausdrücke können in Zahlen, Zeichenfolgen, Variablen, Felder und Array-Elemente unterteilt werden

Setzen Sie das Eingabefeld auf den Variablennamen:

awk '{name=$1;six=$3; if (six =="man") print name " is " six}' temp

Domänenwert-Vergleichsoperation:

awk 'BEGIN {BASE="27"} {if ($4

Ändern Sie den Wert des numerischen Felds: (Die ursprüngliche Eingabedatei wird nicht geändert)

awk '{if ($1=="asima") $6=$6 - 1;print $1, $6, $7}' temp

Textfeld ändern:

awk '{if ($1=="asima) ($1=="desc");print $1 } ' temp

Nur ​​Änderungsdatensätze anzeigen: (Nur anzeigen, was benötigt wird, vom vorherigen Befehl unterscheiden, auf {} achten)

awk '{if ($1=="asima) {$1== "desc";print$1}}' temp

Erstellen Sie ein neues Ausgabefeld:

awk '{$4=$3-$2; print $4}' temp

Statistischer Spaltenwert:

awk '(tot+=$3);END {print tot}' temp zeigt den Inhalt jeder Spalte an

awk '{(tot+=$3)}; END {print tot} ' temp Nur das Endergebnis anzeigen

Dateilänge hinzufügen:

ls -l|awk '/^[^d]/ {print $9"t"$5} {tot+=$5} END{print "totKB:" tot}'

Es werden nur Dateinamen aufgelistet:

ls -l|awk '{print $9}' Normalerweise ist der Dateiname der 9. Feld

2.6. Integrierte String-Funktion von awk:

gsub(r, s) Ersetzen Sie r durch s im gesamten $0

awk 'gsub(/name/ , "xingming") {print $0}' temp

gsub(r, s, t) Verwenden Sie s, um r

index(s, t) im zu ersetzen gesamtes t Gibt die Zeichenfolge in s zurück. Die erste Position von t

awk 'BEGIN {print index("Sunny", "ny")}' temp Gibt 4

Länge(n) zurück. Gibt die zurück Länge von s

match(s, r) Testen Sie, ob s eine Zeichenfolge enthält, die mit r übereinstimmt

awk '$1=="J.Lulu" {print match($1, "u")} ' temp Return 4

split(s, a, fs) s in Sequenz a auf fs aufteilen

awk 'BEGIN {print split("12#345#6789", myarray, "# ")"'

Gibt 3 zurück, während myarray[1]="12", myarray[2]="345", myarray[3]="6789"

sprint(fmt, exp) Gibt das fmt-Format zurück. Das exp

sub(r, s) ersetzt r durch s aus der am weitesten links stehenden längsten Teilzeichenfolge in $0 (ersetzt nur die erste passende Zeichenfolge)

substr (s, S ) Gibt den Suffixteil zurück, der bei p in der Zeichenfolge s

beginnt. substr(s, p, n) Gibt den Suffixteil zurück, der bei p mit der Länge n in der Zeichenfolge s

beginnt 2.7. Verwendung der printf-Funktion:

Zeichenkonvertierung: echo "65" |awk '{printf "%cn",$0}' Ausgabe A

awk 'BEGIN {printf "%fn" , 999}' Ausgabe 999.000000

Formatierte Ausgabe: awk '{printf "%-15s %sn", $1, $3}' temp Alle ersten Felder verlassen Anzeige ausrichten

2.8. Andere awk-Verwendung:

Wertübergabe an eine Zeile des awk-Befehls:

awk '{if ($5

who |. awk '{if ($1==user) print $1 " sind in " $2 ' user=$LOGNAME Umgebungsvariable verwenden

awk-Skriptbefehl:

Verwenden Sie !/bin/awk -f am Anfang von

. Ohne diesen Satz wird das eigenständige Skript nicht ausgeführt. Beispiel:

!/bin/awk -f

# alle Kommentarzeilen müssen mit einem Hash '#' beginnen

# Name: student_tot.awk

# aufzurufen: student_tot.awk grade.txt

# gibt die Gesamtsumme aus und Durchschnitt der Club-Studentenpunkte

# zuerst eine Kopfzeile drucken

BEGIN

{

„Student Date Member No. Grade Age Points Max“ drucken

print „Name beigetretener gewonnener Punkt verfügbar“

print „============================ ===== ====================="

}

# addieren wir die erzielten Punkte

(tot+=$6);

# Verarbeitung abgeschlossen Jetzt drucken wir die Gesamt- und Durchschnittspunktzahl aus

ENDE

{

drucken „Gesamtpunkte der Club-Studenten:“ tot

print „Durchschnittliche Punkte der Club-Studenten:“ tot/N

}

awk array:

awk Grundlegende Schleifenstruktur

Für (Element im Array) print array[element]

awk 'BEGIN {record="123#456#789";split(record, myarray, "#") }

END { for (i in myarray) {print myarray[i]} }

3.0 Benutzerdefinierte Anweisungen in awk

1. Conditions Judgment Statement (if)

if (expression) #if (Variable in Array)
Statement 1
else
Statement 2

Im Format „Statement 1" kann Es handelt sich um mehrere Anweisungen. Wenn Sie das Urteil von Unix awk und Ihr eigenes Lesen erleichtern möchten, sollten Sie mehrere Anweisungen besser mit {} einschließen. Die Unix-awk-Zweigstruktur ermöglicht eine Verschachtelung und ihr Format ist:

if(expression)

{Statement 1}

else if (expression)
{ Statement 2}
else
{Statement 3}

[chengmo@localhost nginx]# awk 'BEGIN{
test=100;
if(test>90)
{
print „sehr gut“;
}
else if(test>60)
{
print „good“;
}
else
{
Print " kein bestanden";
}
}'

sehr gut

Jede Befehlsanweisung kann mit einem „;“-Zeichen beendet werden.

2. Schleifenanweisungen (while, for, do)

1. while-Anweisung

Format:

while (Ausdruck Formel)

{Anweisung}

Beispiel:

[chengmo@localhost nginx]# awk 'BEGIN{
test=100;
total=0;
while(i{
total+=i;
i++;
}
print total;
}'
5050

2.for-Schleife

Die for-Schleife hat zwei Formate:

Format 1:

for (Variable im Array)

{Anweisung}

Beispiel:

[chengmo@localhost nginx]# awk 'BEGIN{
for(k in ENVIRON)
{
print k"="ENVIRON[k];
}
}'

AWKPATH=.:/usr/share/awk
OLDPWD=/home/web97
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
LANG=zh_CN.GB2312

. . . . . .

Erklärung: ENVIRON ist eine awk-Konstante und ein subtypisches Array.

Format 2:

für (Variable; Bedingung; Ausdruck)

{Anweisung}

Beispiel:

[chengmo@ localhost nginx]# awk 'BEGIN{
total=0;
for(i=0;i{
total+=i;
}
print total ;
}'

5050

3.do-Schleife

Format:

do

{statement}while( Bedingung )

Beispiel:

[chengmo@localhost nginx]# awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(iprint total;
}'
5050

und höher Es handelt sich um die awk-Flusskontrollanweisung. Wie Sie an der Syntax erkennen können, ist sie dieselbe wie die C-Sprache. Mit diesen Anweisungen können viele Shell-Programme tatsächlich an awk übergeben werden, und die Leistung ist sehr schnell.

Detaillierte Erklärung des awk-Befehls

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Verwendung des AWK-BefehlsNächster Artikel:Verwendung des AWK-Befehls