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

Detaillierte Erklärung des Linux-Befehls awk

高洛峰
高洛峰Original
2016-12-12 16:14:301252Durchsuche

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 Verarbeitungstextes

awk '{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 verstehen

awk -F: '{print $1,$3,$6} ' OFS="t" /etc/passwd //Ausgabefelder 1,3,6, mit Tabulatorzeichen als Trennzeichen

-f gibt die Skriptdatei an

awk - f script.awk-Datei

BEGIN{

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: '{Print $ nf}' /etc /passwd // Den Wert des nf pro Zeile jeder Zeile ausgeben

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 '{Print nr, $ 0 }'/etc/passwd // Gibt die Zeilennummer jeder Zeile aus

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 5

awk -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 oben

awk -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 () erweitern

awk -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 Ausgabe

netstat -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-Anweisung

awk -F: '{if($3>100) print "large"; else print " small"}' /etc/passwd

small

klein

klein

groß

klein

klein

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


[root@localhost home]# cat 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

Detaillierte Erklärung des Linux-Befehls awk

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