awk ist ein Zeilenprozessor: Im Vergleich zu den Vorteilen der Bildschirmverarbeitung kommt es bei der Verarbeitung großer Dateien nicht zu Speicherüberlauf oder langsamen Verarbeitungsproblemen. Er wird normalerweise zum Formatieren von Textinformationen verwendet.
awk-Verarbeitungsprozess: Verarbeiten Sie jede Zeile nacheinander und geben Sie dann die
awk-Befehlsform aus:
awk [-F|-f|-v] 'BEGIN{} //{command1 command2} END{ } ' Datei
[-F|-f|-v] Großer Parameter, -F gibt das Trennzeichen an, -f ruft das Skript auf, -v definiert die Variable var=value
' ' ' Codeblock zitieren
BEGIN Codeblock initialisieren, vor der Verarbeitung jeder Zeile Code initialisieren, hauptsächlich auf globale Variablen verweisen, FS-Trennzeichen festlegen
// Passender Codeblock, kann eine Zeichenfolge oder eine reguläre sein Ausdruck
{} Befehlscodeblock, einschließlich eines oder mehrerer Befehle
; Mehrere durch Semikolons getrennte Befehle
END Codeblock beenden, jede Zeile ausführen Codeblöcke, die danach ausgeführt werden Die Verarbeitung wird hauptsächlich verwendet, um endgültige Berechnungen durchzuführen oder Endzusammenfassungsinformationen auszugeben
Besonderheiten:
$0 stellt die gesamte aktuelle Zeile dar
$1 Das erste Feld in jeder Zeile
NF ‐ zu NR ‐‐‐‐‐ und ? Inkrementell beginnt jede Datei mit 1 Trennzeichen , der Standardwert ist Zeilenumbruch (d. h. der Text wird zeilenweise eingegeben)
~ Übereinstimmung, kein genauer Vergleich im Vergleich zu ==
!~ Nicht übereinstimmend, ungenauer Vergleich
== Gleich, alle müssen gleich sein, genauer Vergleich
!= Nicht gleich, genauer Vergleich
&& Logisch und
|| Logisch oder
+ Beim Matching bedeutet es 1 oder mehr
/[0-9][0-9]+/ Zwei oder mehr Zahlen
/[0-9][ 0- 9]*/ Eine oder mehrere Zahlen
FILENAME Dateiname
OFS Ausgabefeldtrennzeichen, der Standardwert ist auch ein Leerzeichen, das in Tabulatoren usw. geändert werden kann.
ORS Das Ausgabedatensatztrennzeichen ist standardmäßig ein Zeilenumbruchzeichen, d. h. die Verarbeitungsergebnisse werden auch zeilenweise auf dem Bildschirm ausgegeben
-F'[:#/]' Definieren Sie drei Trennzeichen
print & $0
print ist der Hauptbefehl von awk zum Drucken des angegebenen Inhalts
awk '{print}' /etc/passwd == awk '{print $0 }' /etc/passwd
AWK '{Print ""}'/ETC/PASSWD // Geben Sie nicht den Inhalt von passwd aus, sondern geben Sie die gleiche Anzahl von Luftlinien aus. Es erklärt weiter, dass AWK ein ist Zeile des Verarbeitungstextesawk '{print "a"}' /etc/passwd /etc/passwd /etc/passwd awk -F: '{print $1; print $2}' /etc/passwd /etc/passwd //Die ersten beiden Felder jeder Zeile in separaten Zeilen ausgeben, um die Verarbeitung von Text Zeile für Zeile besser zu verstehenawk -F: '{print $1,$3,$6} ' OFS="t" /etc/passwd //Ausgabefelder 1,3,6, mit Tabulatorzeichen als Trennzeichen -f gibt die Skriptdatei anawk - f script.awk-DateiBEGIN{FS=="}{print $1} //Der Effekt ist derselbe als awk -F=" '{print $1}', außer dass das Trennzeichen im Code selbst mit FS awk 'BEGIN{X =0} /^$/{ X+ =1 } END{print "I find", l|awk 'BEGIN{sum=0}!/^d/{sum+=$5} END{print "total size is",sum}'
-F gibt das Trennzeichen
an$1 bezieht sich auf das erste Feld nach der Angabe des Trennzeichens, $3 bezieht sich auf das dritte Feld, t ist das Tabulatorzeichen
Ein oder mehrere aufeinanderfolgende Leerzeichen oder Tabulatoren werden als Trennzeichen betrachtet, also mehrere Leerzeichen werden als ein Leerzeichen betrachtet
awk -F=" '{print $1}' /etc/passwd
awk -F=" '{print $1 $3}' /etc/passwd ' to ' ' s to ' s ' ' s ‐ ‐ ‐ ‐ ‐ ‐
awk -F=" '{print $1 " " $3}' /etc /passwd // Manuell ein Leerzeichen hinzufügen, um $1 und $3 zu trennen.
awk -F=" '{ print "Benutzername:" $1 "tt Uid:" $3 }' /etc/passwd //Benutzerdefinierte Ausgabe
awk -F: '{print NF}' /etc/passwd //Zeige, wie viele Zeilen es gibt Feld
AWK -F: 'NF == 4 {PRINT} '/ETC/PASSWD // Zeilen mit nur 4 Feldern anzeigen
AWK -F:' NF & GT; 2 {Print $ 0} '/etc/passwd // Zeigt an, dass die Anzahl jeder Zeile größer als 2 pro Zeile ist
AWK -F: '{Print nr, nf, $ nf, "T ",$0}' /etc/passwd //Drucke die Zeilennummer, Feldnummer, letzter Feldwert, Tabulatorzeichen und Inhalt jeder Zeile in Folge awk -F: 'NR==5{print}' / etc/passwd // Anzeigezeile 5awk -F: 'NR==5 ||. NR==6{print}' /etc/passwd > Route -n | die erste Zeile
// Übereinstimmung mit dem Codeblock
// Reine Zeichenübereinstimmung !//Reine Zeicheninkongruenz ~//Feldwertübereinstimmung !~//Feldwertinkongruenz ~/ a1|a2/Feldwert stimmt mit a1 oder a2 überein
awk '/mysql/' /etc /passwd
awk '/mysql/{print }' /etc/passwd
awk '/mysql/{print $0}' /etc/passwd / // Ausgabezeilen, die nicht mit MySQL übereinstimmen
awk '/mysql|mail/{print}' /etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/ ,/mysql/{print}' /etc/passwd //Intervallübereinstimmung
awk '/[2][7][7]*/{print $0}' /etc/passwd / >
awk -F: '$1~/mail/{print $1}' /etc/passwd > ) print $1}' /etc/passwd //Wie obenawk -F: '$1!~/mail /{print $1}' /etc/passwd //Trifft nicht zu awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd IF-Anweisung muss in {} verwendet werden und den Vergleichsinhalt mit () erweiternawk -F: '{if($1~/mail/) print $1 }' /etc/passwd if($1~/mail/) {print $1}}' /etc/passwd. }}' /etc/passwd //if...else...Bedingter Ausdruck== != > >= awk -F=" '$1=="mysql"{print $3}' /etc/passwd awk -F":" '{if($1== "mysql") print $3}' /etc/passwd //Gleiche wie oben
} ' /etc/passwd using using ‐ ‐ ‐ ‐ ‐‐‐ // Größer als
awk -F":" '$3>=100{print $3}' " '$3awk -F="'$3
Logische Operatoren
&& ||. awk -F: '$1~/mail/ && $3>8 {print }' /etc /passwd //Logisches UND, $1 stimmt mit Mail überein , und $3>8
awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd
awk -F: '$1 ~/mail/ ||. $3>1000 {print }' /etc/passwd //Logisches ODER
awk -F: '{if($1~/mail / || $3>1000) print } ' /etc/passwd
Numerische Operationen
awk -F: '$3 > 100' /etc/passwd
awk -F: ' $3 > 100 ||. $3
awk -F: '$3+$4 > 200' /etc/passwd
awk -F: '/mysql |mail/{print $3+10}' /etc/passwd / /Subtraction
awk -F: '/mysql/{print $3*$4}' /etc/passwd 🎜>awk '/MemFree /{PRINT $ 2/1024} '/Proc/Meminfo // A Division
AWK'/Memfree/{Print INT ($ 2/1024)} '/ProC/Meminfo // Nimm das Ganze
Ausgabetrennzeichen OFS
awk '$6 ~ /FIN/ ||. NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt
//Ausgabefeld 6 entspricht der WAIT-Zeile, die die Zeilennummer jeder Zeile ausgibt, Felder 4, 5 und 6 und verwendet Tabulatoren, um die Felder zu trennen
Geben Sie die Verarbeitungsergebnisse in die Datei
① im Befehlscode aus. Geben Sie direkt in der Blockroute -n aus |awk 'NR!=1{print > "./fs"}'
②Umleitung für Ausgaberoute verwenden -n|awk 'NR!=1{print} ' >
Formatierte Ausgabenetstat -anp|awk '{printf "%-8s %-8s %-10sn",$1,$2 ,$3}' printf stellt die Formatausgabe dar % formatiertes Ausgabetrennzeichen -8 Länge beträgt 8 Zeichen s stellt den Zeichenfolgentyp dar Druckt die ersten drei Felder jeder Zeile , geben Sie das erste Feld zur Ausgabe des Zeichenfolgentyps an (Länge ist 8), das zweite Feld zur Ausgabe des Zeichenfolgentyps (Länge ist 8), Drei Felder geben den Zeichenfolgentyp aus (Länge 10)netstat -anp|awk '$6=="LISTEN" ||. NR==1 {printf "%-10s %-10s %-10s n" ,$1,$2,$3}'netstat -anp |awk '$6=="LISTEN" ||. NR==1 {printf "%-3s %-10s %-10s %-10s n", NR,$1,$2,$3}' IF-Anweisungawk -F: '{if($3>100) print "large"; else print " small"}' /etc/passwdsmallkleinkleingroßkleinklein awk -F: 'BEGIN{A=0; B=0} {if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A, "T", B} ' /ETC /PASSWD// ID ist größer als 100, A plus 1, sonst B plus 1
AWK -F:' {if ($ 3 & lt; 100) next; else print}' /etc/passwd zu 100 bis 100 bis 100) als nächstes;
awk -F: 'BEGIN{i=1} {if(i awk -F: 'BEGIN{i=1} {if(i 另一种形式 awk -F: '{print ($3>100 ? " ja="nein")}' /etc/passwd awk -F: '{print ($3>100 ? $3":tyes":$3":tno")}' /etc/passwd while语句 awk -F: 'BEGIN{i=1} {while(i 7 Wurzel 1 7 x 2 7 0 3 7 0 4 7 Wurzel 5 7 /root 6 数组 netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a ) print i,"t",a[i]}' netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%- 20s %-10s %-5s n", i,"t",a[i]}' 9523 9929 1 HÖREN 6 7903 1 3038/cupsd 1 7913 1 10837 1 9833 1 应用1 awk -F: '{print NF}' helloworld.sh //输出文件每行有多少字段 awk -F: '{print $1,$2,$3,$4 ,$5}' helloworld.sh //输出前5个字段 awk -F: '{print $1,$2,$3,$4,$5}' OFS='t' helloworld.sh //输出前5个字段并使用制表符分隔输出 awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='t' helloworld.sh //制表符分隔输出前5个字段,并打印行号 应用2 awk -F'[:#]' '{print NF}' helloworld.sh //指定多个分隔符: #,输出每行多少字段 awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='t ' helloworld.sh //制表符分隔输出多字段 应用3 awk -F'[:#/]' '{print NF}' helloworld .sh 1 $, 2 $, 3 $, 4 $, 5 $, 6 $, 7 $, 8 $ ,$9,$10,$11,$12}' helloworld.sh //制表符分隔输出多字段 应用4 计算/home目录下,普通文件的大小,使用KB作为单位 ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024," KB"}' ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "Gesamtgröße ist:",int(sum/1024)," KB"}' //int是取整的意思 应用5 统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少 netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s n", i," " ,sum[i]}' 应用6 统计/home目录下不同用户的普通文件的总数是多少? ls - l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s n",i," ",sum [i]}' mysql 199 root 374 统计/home目录下不同用户的普通文件的大小总Größe是多少? ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s n", i," ",sum[i]/1024/1024,"MB"}' Anwendung 7 Ausgabeergebnistabelle awk 'BEGIN{math=0;eng=0;com=0;printf "Zeilennr. Name Nr. Mathe Englisch Computer Totaln";printf "---------------------------- ------ ------------------n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %- 7s %-7s %-9s %-10s %-7s n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------ ------- ----------------------------------------N"; printf „%-24s % -7s %-9s %-20s n“, „Total:“,math,eng,com;printf „%-24s %-7s %-9s %-20s n“, „Avg:“, math/NR,eng/ NR,com/NR}' test0 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
[root@localhost home]# cat test0