简单使用:
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:
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: . 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) 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) [chengmo@localhost nginx]# awk 'BEGIN{ 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{ 2.for-Schleife Die for-Schleife hat zwei Formate: Format 1: for (Variable im Array) {Anweisung} Beispiel: [chengmo@localhost nginx]# awk 'BEGIN{ AWKPATH=.:/usr/share/awk . . . . . . 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{ 5050 3.do-Schleife Format: do {statement}while( Bedingung ) Beispiel: [chengmo@localhost nginx]# awk 'BEGIN{ 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.
Statement 1
else
Statement 2
{ Statement 2}
else
{Statement 3}
test=100;
if(test>90)
{
print „sehr gut“;
}
else if(test>60)
{
print „good“;
}
else
{
Print " kein bestanden";
}
}'
test=100;
total=0;
while(i{
total+=i;
i++;
}
print total;
}'
5050
for(k in ENVIRON)
{
print k"="ENVIRON[k];
}
}'
OLDPWD=/home/web97
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
LANG=zh_CN.GB2312
total=0;
for(i=0;i{
total+=i;
}
print total ;
}'
total=0;
i=0;
do
{
total+=i;
i++;
}while(iprint total;
}'
5050