Bevor wir awk lernen, sollten wir sed, grep, tr, cut und andere Befehle gelernt haben. Diese Befehle dienen alle der bequemen Text- und Datenverarbeitung unter Linux, aber wir werden feststellen, dass diese Befehle unsere Anforderungen oft nicht vollständig auf einmal erfüllen. Oft müssen wir Pipe-Symbole in Kombination mit diesen Befehlen verwenden. Heute werde ich Ihnen einen Befehl awk vorstellen, der unsere Anforderungen an die Text- und Datenverarbeitung gut erfüllen kann und es uns ermöglicht, viele Probleme mit einem Befehl zu lösen. 1. Einführung in den awk-Befehl Awk gilt als einer der drei Musketiere der Textverarbeitung. Sein Name leitet sich von den Anfangsbuchstaben der Nachnamen seiner Gründer Alfred Aho, Peter Weinberger und Brian Kernighan ab. Tatsächlich verfügt AWK über eine eigene Sprache: die AWK-Programmiersprache, die von ihren drei Entwicklern formal als „Mustererkennungs- und -verarbeitungssprache“ definiert wurde. Sie können damit kurze Programme erstellen, die Eingabedateien lesen, Daten sortieren, Daten verarbeiten, Berechnungen mit den Eingaben durchführen und Berichte erstellen – neben unzähligen anderen Funktionen. 2. awk-Befehlsformat und Optionen Grammatische Form awk [Optionen] 'Skript' var=Wert Datei(en) Allgemeine Befehlsoptionen -F fs fs gibt das Eingabetrennzeichen an, fs kann eine Zeichenfolge oder ein regulärer Ausdruck sein, beispielsweise -F: 3. Das Prinzip von awk Schritt 1: Führen Sie die Anweisungen im Anweisungsblock BEGIN{ commands } aus. Der END-Block wird ausgeführt, nachdem awk alle Zeilen aus dem Eingabestream gelesen hat. Beispielsweise wird die Informationszusammenfassung, wie das Drucken der Analyseergebnisse aller Zeilen, im END-Block abgeschlossen. Es ist auch ein optionaler Block. Die allgemeinen Befehle im Musterblock sind der wichtigste Teil und auch sie sind optional. Wenn der Musteranweisungsblock nicht angegeben ist, wird standardmäßig {print} ausgeführt, d. h. jede gelesene Zeile wird gedruckt und der Anweisungsblock wird für jede von awk gelesene Zeile ausgeführt. 4. Grundlegende Verwendung von awk Es gibt drei Möglichkeiten, awk aufzurufen 1. Befehlszeilenmethode Unter diesen sind die Befehle echte Awk-Befehle und [-F Feldtrennzeichen] ist optional. Eingabedatei(en) sind die zu verarbeitenden Dateien. 2. Shell-Skript-Methode Ein awk-Skript besteht normalerweise aus drei Teilen: einem BEGIN-Anweisungsblock, einem allgemeinen Anweisungsblock, der Mustervergleiche verwenden kann, und einem END-Anweisungsblock. Diese drei Teile sind optional. Beide Teile müssen nicht im Skript erscheinen, das normalerweise in einfache oder doppelte Anführungszeichen eingeschlossen ist, zum Beispiel: awk 'BEGIN{ i=0 } { i++ } END{ print i }' Dateiname awk "BEGIN{ i=0 } { i++ } END{ print i }" Dateiname 3. Fügen Sie alle awk-Befehle in eine separate Datei ein und rufen Sie dann auf awk -f awk-script-file Eingabedatei(en) Die Option -f lädt das Awk-Skript in die Awk-Skriptdatei und die Eingabedatei(en) und entspricht der obigen Befehlszeilenmethode. [root@localhost ~]# awk '{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync Herunterfahren: x: 6: 0: Herunterfahren: / sbin: / sbin / Herunterfahren halt:x:7:0:halt:/sbin:/sbin/halt ................................................................................. [root@localhost ~]# echo 123|awk '{print "hallo,awk"}' hallo, awk [root@localhost ~]# awk '{print "hi"}' /etc/passwd Hi Hi Hi Hi Hi Hi Hi Hi Hi .................................................................................
Der awk-Workflow ist wie folgt: Lesen Sie einen Datensatz, der durch ein Zeilenumbruchzeichen „\n“ getrennt ist, und teilen Sie den Datensatz dann entsprechend dem angegebenen Feldtrennzeichen in Felder auf. Füllen Sie die Felder aus. $0 steht für alle Felder, $1 für das erste Feld und $n für das n-te Feld. Das Standard-Domänentrennzeichen ist „leer“ oder „[Tabulator]-Taste“, sodass $1 den angemeldeten Benutzer darstellt, $3 die IP des angemeldeten Benutzers und so weiter. wie Alle Benutzernamen unter /etc/passwd drucken [root@localhost ~]# awk -F: '{print $1}' /etc/passwd Wurzel bin Daemon adm .............................................................................. [root@localhost ~]# awk -F: '{print $1,$3}' /etc/passwd Wurzel 0 Behälter 1 Dämon 2 .............................................................................. [root@localhost ~]# awk -F: '{print "Benutzername: " $1 "\t\tuid: "$3}' /etc/passwd Benutzername: root UID: 0 Benutzername: bin uid: 1 Benutzername: Daemon-UID: 2 .............................................................................. 5. Integrierte awk-Variablen
Beispiel [root@localhost ~]# echo -e "Zeile1 f2 f3\nZeile2 f4 f5\nZeile3 f6 f7" | awk '{print "Zeilennummer:"NR", Anzahl der Felder:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}' Zeilennummer: 1, Anzahl der Felder: 3 $0=Zeile1 f2 f3 $1=Zeile1 $2=f2 $3=f3 Zeilennummer: 2, Anzahl der Felder: 3 $0=Zeile2 f4 f5 $1=Zeile2 $2=f4 $3=f5 Zeilennummer: 3, Anzahl der Felder: 3 $0=Zeile3 f6 f7 $1=Zeile3 $2=f6 $3=f7 Verwenden Sie print $NF, um das letzte Feld in einer Zeile zu drucken, verwenden Sie $(NF-1), um das vorletzte Feld zu drucken, und so weiter: [root@localhost ~]# echo -e "Zeile1 f2 f3\n Zeile2 f4 f5" | awk '{print $NF}' f3 f5 [root@localhost ~]# echo -e "Zeile1 f2 f3\n Zeile2 f4 f5" | awk '{print $(NF-1)}' f2 f4 Statistiken zu /etc/passwd: Dateiname, Zeilennummer, Anzahl der Spalten pro Zeile und entsprechender vollständiger Zeileninhalt: [root@localhost ~]# awk -F ':' '{print "Dateiname:" DATEINAME ",Zeilennummer:" NR ",Spalten:" NF ",Zeileninhalt:"$0}' /etc/passwd Dateiname:/etc/passwd,Zeilennummer:1,Spalten:7,Zeileninhalt:root:x:0:0:root:/root:/bin/bash Dateiname:/etc/passwd,Zeilennummer:2,Spalten:7,Zeileninhalt:bin:x:1:1:bin:/bin:/sbin/nologin Dateiname:/etc/passwd,Zeilennummer:3,Spalten:7,Zeileninhalt:Daemon:x:2:2:Daemon:/sbin:/sbin/nologin Zählen Sie die Kommandozeilenparameter ARGC, Dateizeilennummer FNR, Feldtrennzeichen FS, Anzahl der Felder in einem Datensatz NF, Anzahl der gelesenen Datensätze (Standard ist Zeilennummer) NR in der Datei /etc/passwd [root@localhost ~]# awk -F: 'BEGIN{printf "%4s %4s %4s %4s %4s %4s\n","DATEINAME","ARGC","FNR","FS","NF","NR";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s\n",DATEINAME,ARGC,FNR,FS,NF,NR}' /etc/passwd DATEINAME ARGC FNR FS NF NR --------------------------------------------- /etc/passwd 2 1 : 7 1 /etc/passwd 2 2 : 7 2 /etc/passwd 2 3 : 7 3 6. Erweiterte Verwendung von awk 1.awk-Zuweisungsoperation Zuweisungsanweisungsoperatoren: = += -= *= /= %= ^= **= Beispiel: a+=5 ist äquivalent zu a=a+5 [root@localhost ~]# awk 'BEGIN{a=5;a+=5;print a}' 10 2. Die reguläre Betriebsausgabe von awk enthält die Root-Zeile und druckt den Benutzernamen und die UID sowie den ursprünglichen Zeileninhalt. [root@localhost ~]# awk -F: '/root/ {print $1,$3,$0}' /etc/passwd root 0 root:x:0:0:root:/root:/bin/bash Operator 11 Operator:x:11:0:Operator:/root:/sbin/nologin Wir haben zwei Zeilen gefunden. Wenn wir die Zeile finden wollen, die mit root beginnt, müssen wir sie folgendermaßen schreiben: awk -F: '/^root/' /etc/passwd 3.awk ternäre Operation [root@localhost ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}' OK [root@localhost ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}' ähm Die ternäre Operation ist eigentlich eine Beurteilungsoperation. Wenn sie wahr ist, was dann ausgeben? Wenn es falsch ist, geben Sie Folgendes aus: 4. Zyklische Verwendung von awk Verwendung der if-Anweisung [root@localhost ~]# awk 'BEGIN{ test=100;if(test>90){ print "vear good";} else{print "no pass";}}' tragen gut Jeder Befehl endet mit ; [root@localhost ~]# awk 'BEGIN{test=100;num=0;while(i<=test){num+=i; i++;}print num;}' 5050 Verwendung einer For-Schleife [root@localhost ~]# awk 'BEGIN{test=0;for(i=0;i<=100;i++){test+=i;}print test;}' 5050 Verwendung einer do-Schleife [root@localhost ~]# awk 'BEGIN{test=0;i=0;do{test+=i;i++}while(i<=100)print test;}' 5050 5. Array-Anwendung von awk Arrays sind die Seele von awk. Das Wichtigste bei der Textverarbeitung ist die Array-Verarbeitung. Da Array-Indizes (Indizes) Zahlen und Zeichenfolgen sein können, werden Arrays in awk assoziative Arrays genannt. Arrays in awk müssen weder im Voraus deklariert werden, noch muss ihre Größe angegeben werden. Array-Elemente werden je nach Kontext mit 0 oder dem leeren String initialisiert. Im Allgemeinen werden Arrays in awk verwendet, um Informationen aus Datensätzen zu sammeln, die zum Berechnen von Summen, Zählen von Wörtern, Verfolgen der Anzahl von Übereinstimmungen mit einer Vorlage usw. verwendet werden können. awk -F: 'BEGIN {Anzahl=0;} {Name[Anzahl] = $1;Anzahl++;}; END{für (i = 0; i < NR; i++) drucke i, Name[i]}' /etc/passwd 0 Wurzel 1 Behälter 2 Dämon 3 Anzeige 4 LP 5 synchronisieren .............................................................................. 6. Anwendung von awk-String-Funktionen Funktionsname Beschreibung Beispiele: awk '{ sub(/test/, "mytest"); print }' Testdatei awk '{ sub(/test/, "mytest"); $1}; print }' Testdatei Das erste Beispiel stimmt mit dem gesamten Datensatz überein, und die Ersetzung erfolgt nur beim ersten Vorkommen einer Übereinstimmung. Wenn Sie die gesamte Datei abgleichen möchten, müssen Sie gsub verwenden Das zweite Beispiel stimmt mit dem ersten Feld im gesamten Datensatz überein, und die Ersetzung erfolgt nur bei der ersten Übereinstimmung. Beispiele: awk '{ gsub(/test/, "mytest"); print }' Testdatei awk '{ gsub(/test/, "mytest" , $1) }; print }' Testdatei Das erste Beispiel stimmt im gesamten Dokument mit „Test“ überein und alle Übereinstimmungen werden durch „mytest“ ersetzt. Das zweite Beispiel gleicht das erste Feld im gesamten Dokument ab und alle Übereinstimmungen werden durch mytest ersetzt. Beispiele: Das Beispiel gibt die Position von Test in mytest zurück und das Ergebnis sollte 3 sein. Beispiele: Das obige Beispiel extrahiert die Teilzeichenfolge „Welt“. Beispiele: Das obige Beispiel teilt die Zeit per Doppelpunkt in das Zeitarray auf und zeigt das zweite Array-Element 18 an. Beispiele: awk '{ Drucklänge( "Test") }' awk '{ Drucklänge }' Testdatei Das erste Beispiel gibt die Länge der Testzeichenfolge zurück. Das zweite Beispiel gibt die Anzahl der Zeichen im Datensatz in der Testdatei zurück. Übereinstimmung (Zeichenfolge, regulärer Ausdruck) Beispiele: awk '{start=match("das ist ein Test",/[az]+$/); print start}' awk '{start=match("das ist ein Test",/[az]+$/); print start, RSTART, RLENGTH }' Das erste Beispiel druckt die Startposition der Sequenz, die mit aufeinanderfolgenden Kleinbuchstaben endet, in diesem Fall 11. Das zweite Beispiel druckt auch die Variablen RSTART und RLENGTH, nämlich 11(start), 11(RSTART), 4(RLENGTH). toupper(Zeichenfolge) Beispiele: Das könnte Sie auch interessieren:
|
<<: vue-table implementiert das Hinzufügen und Löschen
>>: Tutorial zur Installation der Dekomprimierungsversion von MySQL 8.0.12
Bereiten Sie die Datenbank (MySQL) vor. Wenn Sie ...
1. Funktionseinführung sed (Stream EDitor) ist ei...
Heute habe ich mysql-5.7.18-winx64.zip von der of...
1. CSS-Elemente verbergen <br />In CSS gibt ...
Die Master-Slave-Synchronisierung, auch Master-Sl...
Inhaltsverzeichnis Vorwort analysieren Daten insg...
WeChat Mini-Programm - QR-Code-Generator Download...
(1) Experimentelle Umgebung youxi1 192.168.5.101 ...
Inhaltsverzeichnis MySQL-Einschränkungsoperatione...
1 Was ist der BEM-Namensstandard Bem ist die Abkü...
Sophie Hardach Kai von Clyde Quay 37 Ost Seifenkis...
Es gibt zwei spezielle Werte, die jeder Eigenscha...
Hintergrund: Machen Sie jeden Tag ein wenig Forts...
Win10-Installation (überspringen, falls bereits i...
Die wesentlichen Inhalte dieses Artikels sind wie...