Heim >php教程 >PHP开发 >awk-Befehle und Beispiele

awk-Befehle und Beispiele

高洛峰
高洛峰Original
2016-12-15 11:09:261898Durchsuche

AWK-Einführung
9.1 Drei Möglichkeiten, awk aufzurufen
:
1. Befehlszeilenmethode:
awk [-F file-separator] 'commands' input-files
-F Angeben Trennzeichen (Standard ist Leerzeichen oder Tabulator)
commands awk command
input-files Zu verarbeitende Datei
2. Fügen Sie alle awk-Befehle in eine Datei ein, machen Sie das awk-Programm ausführbar und verwenden Sie dann den awk-Befehlsinterpreter als erste Zeile des Skripts, damit es durch Eingabe des Skriptnamens aufgerufen werden kann
3 Fügen Sie alle awk-Befehle in eine einzelne Datei ein und rufen Sie dann auf:
awk -f awk-script-file input-files
-f Gibt den Namen des aufrufenden Skripts an
input-files Zu verarbeitende Dateien

9.2 Awk-Skript
Beim Aufruf von awk in einem Befehl besteht das awk-Skript aus verschiedenen Operationen und Modi.
awk liest jeweils einen Datensatz oder eine Zeile und trennt die angegebenen Felder mithilfe des angegebenen Trennzeichens. Wenn eine neue Zeile erscheint, erfährt der Befehl awk, dass der gesamte Datensatz gelesen wurde, und startet dann den Lesebefehl für den nächsten Datensatz. Dieser Lesevorgang wird fortgesetzt, bis das Ende der Datei erreicht ist oder die Datei nicht mehr existiert.
9.2.1 Muster und Aktionen
Jede awk-Anweisung besteht aus Mustern und Aktionen. Der Modusteil bestimmt, wann die Aktionsanweisung ausgelöst wird und welche Auslösebedingungen vorliegen. Unter Verarbeitung versteht man die an Daten ausgeführten Vorgänge. Wenn der Modusteil weggelassen wird, wird die Aktion immer ausgeführt.
Das Muster kann eine beliebige bedingte Anweisung, zusammengesetzte Anweisung oder ein regulärer Ausdruck sein, einschließlich zweier Spezialfelder BEGIN und END. Verwenden Sie die BEGIN-Anweisung, um die Anzahl und den Druckkopf festzulegen. Die BEGIN-Anweisung wird vor jeder Text-Browsing-Aktion verwendet. Danach beginnt die Ausführung der Text-Browsing-Aktion basierend auf der Eingabedatei. Die END-Anweisung wird verwendet, um die Gesamtzahl der Texte und das Endstatus-Flag auszudrucken, nachdem awk die Textdurchsuchungsaktion abgeschlossen hat. Wenn Sie kein Muster angeben, stimmt awk immer überein.
Die eigentliche Aktion wird in geschweiften Klammern {} angegeben. Die meisten Aktionen dienen zum Drucken, es gibt aber auch längeren Code wie if- und Schleifenanweisungen und Schleifenexitstrukturen. Wenn keine Aktion angegeben ist, druckt awk alle durchsuchten Datensätze aus.
9.2.2 Domänen und Datensätze
Wenn awk ausgeführt wird, wird seine Browsing-Domäne als $1, $2...$n markiert. Diese Methode wird als Domänenidentifizierung bezeichnet. Wenn Sie mehrere Domänen angeben müssen, verwenden Sie Kommas, um sie zu trennen. Beispielsweise gibt $1, $3 die erste Domäne an und die dritte Domäne. Wenn Sie alle Domänen angeben möchten, können Sie $0 verwenden.
Verwenden Sie den Druckbefehl, um Druckvorgänge auszuführen. Dies ist ein awk-Befehl und muss in {} eingeschlossen werden.
1. Domäne extrahieren
Beispiel: Es gibt eine grade.txt-Datei mit folgendem Inhalt:
$ cat grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J . Lulu 06/99 48317 Grün 9 24 26
P.Bunny 02/99 48 Gelb 12 35 28
J.Troll                                                                                                                                                         L.Tansley  ​-2 12 30 28
Diese Textdatei hat 7 Felder, mit Leerzeichen als Feldtrennzeichen
2. Awk-Ausgabe speichern
Zwei Möglichkeiten, die Ausgabe von awk zu speichern:
Umleiten in eine Datei: (Keine Anzeige auf dem Bildschirm)
$ awk '{print $0} ' grade.txt >wow
Verwenden Sie eine Pipe, um das Ausgabeergebnis an tee zu übergeben: (Ergebnis wird auf dem Bildschirm angezeigt)
$ awk '{print $0}' grade.txt|tee woww
3. Mehrere Methoden mit Standardeingabe
$belts.awk grade.txt
$belts.awk < grade.txt
Alle Datensätze drucken
$ awk '{print $0}' grade.txt
5. Separate Datensätze drucken
Nur ​​$1 und $4 drucken:
$ awk '{print $1,$4}' grade.txt
6. Benutzerdefiniertes Format drucken
Sie können hinzufügen Kommentare über $1 und $4, Name und Gürtel:
$ awk 'BEGIN {print "NamettBeltn-------------- ----------"} {print $1 "t"$4}' grade.txt
Schlusskommentar am Ende hinzufügen:
$ awk 'BEGIN {print "NamettBeltn----- --------------- -----"} {print $1"t"$4} END {print "---------------- ---------nEnde des Berichts"}' grade.txt
7. awk-Fehlermeldung
Wenn Sie auf einen awk-Fehler stoßen, können Sie entsprechend suchen:
• Stellen Sie sicher, dass der gesamte awk-Befehl in einfache Anführungszeichen gesetzt wird
• Stellen Sie sicher, dass alle Anführungszeichen im Befehl werden paarweise angezeigt
• Stellen Sie sicher, dass Aktionsanweisungen in geschweifte Klammern {} und bedingte Anweisungen in eckige Klammern eingeschlossen werden ()
• Möglicherweise haben Sie vergessen, geschweifte Klammern zu verwenden. {}
8. awk-Tastatureingabe
Wenn keine Eingabedatei angegeben ist, holt awk die Eingabe über die Tastatur und drückt abschließend die Eingabetaste
9.2.3 Metazeichen
^ $ Beispiel für das vorherige Einzelzeichen
:
/XY+Z/ Entspricht XYZ, XYYYYZ
/XY?Z/ Entspricht XYZ, > < > Größer als
>= > oder gleich
~ Entspricht dem regulären Ausdruck
!~ Entspricht nicht dem regulären Ausdruck
1. Matching
verwendet ~ gefolgt vom regulären Ausdruck, um die Domäne abzugleichen, oder wenn die Bedingung in ( )
Beispiel:
Abfrage brauner Gürtel Alle Situationen von Schülern (drucken Sie die Zeile aus, in der $4 mit Braun übereinstimmt)
$ awk '{if ($4~/Brown/) print $0}' grade.txt
oder
$ awk '$0 ~ /Brown/ ' grade.txt
2. Genaue Übereinstimmung
Verwenden Sie == und schließen Sie die Bedingung in doppelte Anführungszeichen ein, um die Bedingung genau zu erfüllen
Beispiel:
$ awk '{if ($3 == "48") print $0 }' grade.txt
3. Stimmt nicht überein
Verwenden Sie!~Folgen Sie dem Nichtübereinstimmungsfeld für reguläre Ausdrücke
Beispiel:
Alle abfragen Schüler, die keine braunen Gürtel haben (drucken Sie $4 aus, das nicht mit der braunen Linie übereinstimmt)
$ awk '{if ($4!~/Brown/) print $0}' grade.txt
oder
$ awk ' $0 !~ /Brown/' grade.txt
4. Vergleich
Da mehrere Vergleichsoperatoren auf die gleiche Weise verwendet werden, möchte ich Ihnen ein Beispiel geben:
$ awk '{if ($6 < $7 ) print $1" try better at the next comp"}' txt
5. Verschiedene Übereinstimmungen
entsprechen Grün oder Grün:
$ awk '/[Gg]reen/' grade.txt
Das vierte Zeichen, das zu $1 passt, ist ein:
$ awk '$1 ~ /^...a/' grade.txt
entspricht Gelb oder Braun:
$ awk '$4 ~ /Yellow|Brown/' grade .txt
entspricht Zeilen, die mit J beginnen:
$ awk '$0 ~ /^J/' grade.txt
6. Zusammengesetzte Ausdrücke
Zusammengesetzte Muster oder zusammengesetzte Operatoren werden verwendet, um komplexe logische Operationen zu bilden. Zusammengesetzte Ausdrücke werden zwischen Mustern verwendet. Ausdrücke, die zusammengesetzte Operatoren
&& UND: Beide Seiten des Symbols müssen gleichzeitig wahr sein
|| 🎜>! : Nicht-Inversion
Beispiel:
$ awk '{if ($1 == "P.Bunny" && $4 == "Yellow") print $0}' grade.txt
$ awk ' {if ($4 == "Yellow" || $4 ~ /Brown /) print $0}' grade.txt
9.2.5 integrierte awk-Variablen
awk verfügt über viele integrierte Variablen zum Festlegen von Umgebungsinformationen. Häufig verwendete sind:
ARGC-Anzahl der Befehlszeilenparameter
ARGV-Befehlszeilenparameteranordnung
ENVIRON Unterstützt die Verwendung von Systemumgebungsvariablen in der Warteschlange
FILENAME Von awk gelesener Dateiname
FNR-Nummer der von der aktuellen Datei verarbeiteten Datensatzzeilen
FS Legen Sie das Domänentrennzeichen fest, äquivalent zu -F
NF                                                                           ’ s ’ ’ s it ’ s Die Anzahl der Parameter des Skripts. ARGV ist das Parameteranordnungsarray von ARGC, wobei jedes Element als ARGV[n] dargestellt wird und n der Befehlszeilenparameter ist, auf den Sie zugreifen möchten.
ENVIRON unterstützt vom System festgelegte Umgebungsvariablen der tatsächliche Variablenname, wie zum Beispiel ENVIRON ["EDITOR"]="Vi"
FILENAME ist der Dateiname der Datei, die aktuell vom awk-Skript bearbeitet wird
FNR ist die Anzahl der Datensatzzeilen in der Datei, die aktuell bearbeitet wird awk, und sein Wert ist immer kleiner oder gleich NR. Wenn das Skript auf mehrere Dateien zugreift, wird diese Variable für jede neue Eingabedatei zurückgesetzt
FS wird zum Festlegen des Domänentrennzeichens verwendet, genau wie -F in der Befehlszeile, und der Standardwert ist ein Leerzeichen. Beispiel: Verwenden Sie einen Doppelpunkt als Trennzeichen. FS=="
NF ist die Anzahl der Datensatzfelder (Anzahl der Spalten), die nach dem Lesen des Datensatzes festgelegt wird. $NF wird häufig verwendet, um die letzte Spalte anzugeben
OFS gibt das Feldtrennzeichen für Ausgabedatensätze an, das standardmäßig Leerzeichen ist. Beispiel: Verwenden Sie - als Trennzeichen für die Ausgabe von FS="-"
ORS und RS sind beide Trennzeichen für Ausgabedatensätze, und der Standardwert ist neue Zeile (n)
Beispiel:
Zeigen Sie die Anzahl der Datensätze an die Datei:
$ awk 'END {print NR}' grade.txt
Drucken Sie alle Datensätze, ihre Zeilennummern und die Gesamtzahl der Felder aus und drucken Sie schließlich den Dateinamen der gelesenen Datei aus:
$ awk '{print NF ,NR,$0} END {print FILENAME}' grade.txt
enthält mindestens einen Datensatz und enthält Brown:
$ awk '{if (NR > 0 && $4 ~ /Brown /) print $0}' grade .txt
Eine leistungsstarke Funktion von NF besteht darin, den Rückgabewert der Variablen $PWD an awk zu übergeben und ihr Verzeichnis anzuzeigen:
$ echo $PWD -F/ '{print $ NF}'
Dateiname anzeigen:
$ echo "/usr/apache/conf/httpd.conf" | Grundlegender Ausdruck des awk-Operators. Er kann in numerischen Typ, String-Typ, Variablentyp-Feld und Array-Element unterteilt werden.
= += -= *= /= %= ^=                                                                                                                                      Numerischer Typ, String-Typ, Feld vom Typ Variable und Array-Element Union und nicht
~! ~.​ ​ ​ ​ ​ ​ ​ 's Präfix und Suffix
1.  Setzen Sie das Eingabefeld auf den Feldvariablennamen
In awk empfiehlt es sich, beim Durchführen eines Mustervergleichs oder eines relationalen Domänennamens einen aussagekräftigen Domänennamen festzulegen Operationen einfacher zu verstehen. Die allgemeine Methode zum Festlegen von Variablennamen lautet name=$n, wobei name der Name der aufgerufenen Domänenvariablen und n die tatsächliche Domänennummer ist. Trennen Sie mehrere Domänennameneinstellungen durch Semikolons; (bitte beachten Sie die Verwendung von ; unten)
$ awk '{name = $1;belts = $4; if (belts ~ /Yellow/) print name" is belt "belts} ' grade .txt
2. Es gibt zwei Möglichkeiten zu testen, ob ein numerisches Feld kleiner als ein anderes numerisches Feld ist:
1) Weisen Sie dem Variablennamen in BEGIN einen Wert zu
2) In der Beziehung ist dies normalerweise von Vorteil um tatsächliche Werte in Operatoren
zu verwenden, um Werte im BEGIN-Teil zuzuweisen, was viele Probleme beim Vornehmen von Änderungen an awk-Ausdrücken reduzieren kann. Bei relationalen Operationen müssen Sie Klammern verwenden. Beispiel:
Fragen Sie alle Schüler ab, die in allen Wettbewerben weniger als 27 Punkte erzielt haben:
$ awk '{if ($6 < 27) print $0}' grade.txt
oder
$ awk 'BEGIN { BASELINE = "27"} {if ($6 < BASELINE) print $0}' grade.txt
3. Ändern des Werts eines numerischen Feldes
Beim Ändern eines Feldes in awk ist es wichtig, sich daran zu erinnern Die tatsächliche Eingabedatei kann nicht geändert werden, nur die im Cache gespeicherte awk-Kopie wird geändert. Awk spiegelt die Änderungsspuren in der Variablen NR oder NF wider.
Um das numerische Feld zu ändern, weisen Sie der Feldkennung einfach einen neuen Wert zu. Beispiel:
$ awk '{if ($1 == "M.Tansley") $6 = $6 - 1; print $1,$6,$7}' grade.txt
4. Textfeld ändern Die Domäne wird einer neuen Zeichenfolge zugewiesen. Denken Sie daran, in der gesamten Syntax doppelte Anführungszeichen für Zeichenfolgen und Klammern zu verwenden. Beispiel:
$ awk '{if ($1 == "J.Troll") ($1 = "J.L.Troll"); print $1}' grade.txt
Nur ​​Änderungsdatensätze anzeigen
if-Datei Es ist sehr groß und enthält viele geänderte Datensätze, sodass Sie nur die geänderten Teile anzeigen müssen. Wenn Sie nach dem Muster geschweifte Klammern {} verwenden, werden nur die geänderten Teile gedruckt. Rufen Sie das Muster ab und führen Sie Operationen basierend auf den Musterergebnissen aus. Beispiel: (Beachten Sie die Position der geschweiften Klammern)
$ awk '{if ($1 == "J.Troll") {$1 = "J.L.Troll"; print $1}}' grade.txt
6. Neue Ausgabedomänen erstellen
Bei der Verarbeitung von Daten in awk empfiehlt es sich, neue Domänen zu erstellen, wenn Berechnungen auf der Grundlage jeder Domäne durchgeführt werden. Beim Erstellen einer neuen Domäne muss die neue Domänenkennung einer anderen Domäne zugewiesen werden. Beispiel:
Erstellen Sie eine neue Domain 8 in grade.txt, um die Differenz zwischen dem aktuellen Level-Score der Domain und dem höchsten Level-Score der Domain zu speichern:
$ awk 'BEGIN {print "NametDifference"} {if ($6 < $7) { $8 = $7 - $6; print $1,$8}}' grade.txt
Oder geben Sie der Variablen einen leicht verständlichen Namen:
$ awk 'BEGIN {print "NametDifference"} {if ( $6 < $7) {diff = $7 - $6; print $1,diff}}' grade.txt
7 Spaltenwert erhöhen
Verwenden Sie das Symbol +=, um die Anzahl der Spalten zu erhöhen oder Statistiken zu laufenden Ergebnissen durchzuführen . Weisen Sie den Wert des Variablenfelds auf der rechten Seite des Symbols der linken Seite zu.
Beispiel:
Drucken Sie die Gesamtpunktzahl aller Schüler aus (Summe der $6 in der gesamten Datei, Summe ist der Variablenname):
$ awk '(total += $6); END {print "Club Gesamtpunktzahl der Schüler: „total}‘ grade.txt
Wenn die Datei groß ist und Sie nur den Ergebnisteil und nicht alle Datensätze drucken möchten, fügen Sie einfach geschweifte Klammern {} außerhalb der Anweisung ein:
$ awk '{(total += $6)}; Punkte: "total}' grade.txt
Größe und Summe aller Dateien im aktuellen Verzeichnis anzeigen (ohne Unterverzeichnisse):
$ ls -l|awk '/^[^d]/ {print $9" t"$5 } {total += $5} END {print "total Bytes: "total}'
9.2.9 Integrierte String-Funktionen
awk hat viele leistungsstarke String-Funktionen:
gsub(r,s , t) Ersetzen Sie alle Zeichenfolgen, die den regulären Ausdruck r erfüllen, durch die Zeichenfolge s in der gesamten Zeichenfolge t (wenn t nicht angegeben ist, wird standardmäßig $0 verwendet) Die Position eines Vorkommens (0, wenn es nicht existiert)
length( s) Gibt die Länge der s-Zeichenfolge zurück (wenn s nicht angegeben ist, ist der Standardwert $0)
match(s,r) Gibt die erste Zeichenfolge zurück, die die Position der Zeichenfolge des regulären Ausdrucks r in der Zeichenfolge von s erfüllt (0, wenn keine Übereinstimmung vorliegt)
split(s,a,sep) Verwenden Sie sep, um die Zeichenfolge s in die Elemente des Arrays a zu unterteilen und die Array-Elemente zurückzugeben. Die Zahl (wenn kein Trennzeichen angegeben ist, die Standardeinstellung). ist die gleiche Verwendung wie FS)
sprint("fmt",exp) Verwenden Sie die Formatanweisungen von printf, um den Ausdruck exp zu formatieren und auszugeben
sub(r,s,t) Ersetzen Sie die erste Zeichenfolge, die die Anforderungen erfüllt Regulärer Ausdruck r mit der s-Zeichenfolge in der Zeichenfolge t. Gibt bei Erfolg 1 zurück, andernfalls wird 0 zurückgegeben (wenn t nicht angegeben ist, ist der Standardwert $0)
substr(s,p,n) Gibt die Zeichenfolge mit der Länge von zurück n an der P-Position der P-Position (wenn N nicht angegeben ist, geben Sie die gesamte Zeichenfolge ab der P-Position zurück)
TOLOWER (s) wandelt alle Großbuchstaben in der Zeichenfolge S in Kleinbuchstaben um und gibt die konvertierte Zeichenfolge < zurück 🎜>toupper(s) Wandelt alle Kleinbuchstaben in der Zeichenfolge s in Großbuchstaben um und gibt die konvertierte Zeichenfolge zurück.
1 die gesamte Zeichenfolge t (wenn t nicht angegeben ist, wird standardmäßig $0 verwendet):
$ awk 'gsub(/4842/,4899) {print $0}' grade.txt
oder
$ awk '{ if (gsub(/4842/,4899)) print $0}' grade.txt
2. Index(s,t)
gibt string s zurück. Die Position des ersten Vorkommens von string t in (0, falls dies der Fall ist nicht vorhanden). Die Zeichenfolge muss in doppelte Anführungszeichen gesetzt werden:
$ awk 'BEGIN {print index("Benny","ny")}' grade.txt
3 length(s)
gibt s Zeichen zurück. Die Länge der Zeichenfolge (wenn s nicht angegeben ist, ist der Standardwert $0):
$ awk '$1 == "J.Troll" {print length($1)" "$1}' grade.txt
$ awk ' BEGIN { print length("Kevin ist ein guter Junge.")}'
4. Match(s,r)
Gibt die Position der ersten Zeichenfolge zurück, die den regulären Ausdruck r in der s-Zeichenfolge erfüllt:
$ awk 'BEGIN {print match("ANCD",/d/)}' (gibt 0 zurück)
$ awk '$1=="J.Lulu" {print match($1,/u/)}' grade .txt (gibt die Position des ersten u in J.Lulu zurück: 3)
5. split(s,a,sep)
Verwenden Sie sep, um die Zeichenfolge s in Elemente des Arrays a zu unterteilen und die zurückzugeben Array-Elemente Die Anzahl von ="123"
array[2]="456"
array[3]="789"
6 sub(r,s,t)
Verwenden Sie s Zeichen in der Zeichenfolge t Die Zeichenfolgenersetzung erfüllt die erste Zeichenfolge des regulären Ausdrucks r und gibt bei Erfolg 1 zurück. Andernfalls wird 0 zurückgegeben (wenn t nicht angegeben ist, ist der Standardwert $0):
$ awk '$1 == "J.Troll " {if ( sub(/26/,"29")) print}' grade.txt
7. substr(s,p,n)
Gibt die Zeichenfolge der Länge n ab Position p in Zeichenfolge s zurück (Wenn n nicht angegeben ist, werden alle Zeichenfolgen ab Position p zurückgegeben):
$ awk '$1 == "L.Tansley" {print substr($1,1,5)}' grade.txt (gibt L zurück .Tan)
Wenn der angegebene Längenwert n größer als die Zeichenfolgenlänge ist, gibt awk alle Zeichen ab der Startposition zurück:
$ awk '$1 == "L.Tansley" {print substr($1,3 ,15)} ' grade.txt (zurück zu Tansley)
Wenn n nicht angegeben ist, gibt awk alle Zeichen ab der Startposition zurück:
$ awk '{print substr($1,3)}' grade. txt
im BEGIN-Teil definiert die Zeichenfolge und gibt die extrahierten Zeichen im END-Teil zurück:
$ awk 'BEGIN {STR="Kevin ist ein guter Junge."} END {print substr(STR,12,8 )}' grade.txt
8. Übergeben Sie den String von der Shell an awk
$ echo "Stand-by"|awk '{print length($0)}'
Legen Sie den Dateinamen als Variable fest , nimm den Dateinamen:
$ STR="grade.txt"
$ echo $STR|awk '{print substr($STR,1,5)}'
Dateinamensuffix abrufen:
$ STR="grade.txt"
$ echo $STR|awk ' { print substr($STR,7) }'
9.2.10 awk-Ausgabefunktion printf
awk stellt die Funktion printf bereit, die über mehrere unterschiedlich formatierte Ausgabefunktionen verfügt. Jede printf-Funktion (Steuerformatzeichen) beginnt mit einem %-Symbol und endet mit einem Zeichen, das die Konvertierung bestimmt. Die Transformation enthält drei Modifikatoren.
Syntax:
printf „Format-Steuerzeichen“, Parameter

awk printf-Modifikator
-                                                                                                                                                          . prec Maximale Zeichenfolgenlänge oder Anzahl der Ziffern rechts vom Dezimalpunkt

awk printf format
%c ASCII-Zeichen
%d Ganzzahl
%e Gleitkommazahl (wissenschaftliche Notation)
%f Gleitkommazahl
%g awk entscheidet, welche Gleitkommakonvertierung ( e oder f) zur Verwendung von
%o Oktalzahl
%s String
%x Hexadezimalzahl
Beispiel:
Zeichenkonvertierung:
$ awk 'BEGIN {printf "%cn" ,65}' grade.txt
Formatierte Ausgabe:
Alle Schülernamen und Seriennummern drucken, der Name muss links ausgerichtet sein, 15 Zeichen lang, gefolgt von der Seriennummer:
$ awk '{ printf "%-15s %sn",$1,$3}' grade.txt
Kommentare hinzufügen:
$ awk 'BEGIN { print "NamettNumber"} {printf "%-15s %sn",$1,$3} ' grade.txt
9.2.11 Übergeben Sie einen Wert an eine Zeile des awk-Befehls
Übergeben Sie den Wert in die awk-Variable, bevor awk ausgeführt wird. Platzieren Sie die Variable unter der Befehlszeile, Format:
awk-Befehl Variable = Eingabedateiwert
Beispiel:
$ awk '{if ($5 < AGE) print $0}' AGE=10 grade.txt
Fragen Sie Partitionen mit weniger als 36000 MB freiem Speicherplatz ab:
$ df -m|awk '($4 ~ /^[0-9]/) {if ($4 < LIMIT) print $6"t"$4}' LIMIT= 36000
awk ermöglicht auch die Übergabe von Umgebungsvariablen. Beispiel:
Fragen Sie ab, an welchem ​​Port der aktuelle Benutzer angemeldet ist:
$ who|awk '{if ($1 == user) print $1" Sie werden mit "$2}' user=$LOGNAME
verbunden 9.2.12 Awk-Skriptdatei
kann ein Awk-Skript in eine Datei schreiben und es dann ausführen. Der Vorteil der Verwendung des awk-Skripts besteht darin, dass Sie es nicht jedes Mal neu eingeben müssen und zum leichteren Verständnis Kommentare hinzufügen können. Nehmen Sie als Beispiel ein awk-Skript:
#!/bin/awk -f
# alle Kommentarzeilen müssen mit einem Hash „#“ beginnen
# Name: student_total.awk
# zum Aufrufen von: student_total. awk grade.txt
# druckt die Gesamt- und Durchschnittszahl der Club-Studentenpunkte

# druckt zuerst eine Kopfzeile
BEGIN{
druckt „StudentttDatetNumbertGradetAgetPointstMax“
druckt „NamettJoinedttttGainedtPoint Available“
drucken "============================================ == ======================="
}

# addieren wir die erzielten Punkte
(insgesamt += $6)

# Verarbeitung abgeschlossen Jetzt drucken wir die Gesamt- und Durchschnittspunktzahl aus
ENDE {
Drucken Sie „Club-Studenten-Gesamtpunkte:“ Gesamt
Drucken Sie „Durchschnittliche Club-Studenten-Punkte:“ Gesamt /NR
}
Die erste Zeile ist #!/bin/awk -f. Ohne sie wird das Skript nicht ausgeführt, da sie dem Skript den Speicherort von awk im System mitteilt. Durch die Trennung der Befehle wird die Lesbarkeit des Skripts verbessert und es können Kommentare zwischen den Befehlen eingefügt werden.
Geben Sie beim Ausführen den Dateinamen nach der Skriptdatei ein, Sie müssen jedoch zuerst ausführbare Berechtigungen erteilen.
9.2.13 Verwendung von FS-Variablen in awk
Bei Verwendung von awk-Skripten erfolgt das Festlegen von FS-Variablen im Abschnitt BEGIN. Wenn nicht, weiß awk nicht, was das Domänentrennzeichen ist.
Skriptbeispiel: (Dieses Skript extrahiert die erste und fünfte Domäne aus /etc/passwd)
#!/bin/awk -f
# zum Aufrufen von: passwd.awk /etc/passwd
# Drucken Sie das erste und fünfte Feld aus
BEGIN {
FS=":"}
{print $1,"t",$5}

9.2.14 Übergabe von Werten an das awk-Skript
Die Methode zum Übergeben von Werten an das awk-Skript ist ungefähr die gleiche wie das Übergeben von Werten an die awk-Befehlszeile. Das Format ist:
awk_script var=value input_file
Beispiel:
#!/bin/awk -. f
# Name: age.awk
# aufzurufen: age.awk AGE=n grade.txt
# gibt das Alter aus, das niedriger ist als das in der Befehlszeile angegebene Alter
{if ($5 < AGE)
print $0}
Ausführungsmethode: (vergessen Sie nicht, zuerst die Ausführungsberechtigung zu erteilen)
$ ./age.awk AGE=10 grade.txt
Sie können auch die verwenden Pipe-Befehl, um das Ergebnis des Befehls an das awk-Skript zu übergeben, z. B.
$ cat grade.txt |./ student_total.awk
9.2.15 awk-Array
Das Array muss vor der Verwendung nicht definiert werden Es muss auch nicht die Anzahl der Array-Elemente angegeben werden. Schleifen werden häufig verwendet, um auf Arrays zuzugreifen. Das Folgende ist die Grundstruktur eines Schleifentyps:
for (element in array) print array[element]
Beispiel: (die zuvor erwähnte Zeichenfolge 123#456#789)
#!/bin/awk -f
# Name: arraytest.awk
# druckt ein Array aus
BEGIN {
record="123#456#789";
split(record,array,"#")
}
END {
for (i in array) {
print array[i]
}
}
使用/ dev/null作为输入运行脚本:
$ ./arraytest.awk /dev/null

从指定文本里找出匹配条件的项及其出现的次数
#!/bin/ awk -f
# Name: count.awk
# aufzurufen: count.awk grade2.txt
# durchläuft die Datei grade2.txt und zählt, wie viele Gürtel wir haben (gelb, orange, rot). )
# zählt auch, wie viele Erwachsene und Junioren wir haben
# Beginn von BEGIN
# setze FS und lade die Arrays mit unseren Werten
BEGIN {FS="#"
# lade die Gürtelfarben, an denen wir nur interessiert sind
Gürtel["Gelb"]
Gürtel["Orange"]
Gürtel["Rot"]
# Ende von BEGIN
# Laden Sie den Schülertyp
student["Junior"]
student["Senior"]
}
# Loop-Thru-Array, das die Gürtelfarben gegen Feld-1 hält
# Wenn wir eine Übereinstimmung haben, machen Sie weiter total
{for (Farbe im Gürtel)
  {if ($1 == Farbe)
  Gürtel[Farbe]++}}
# Loop-Thru-Array, das den Schülertyp gegenüberhält
# Feld 2: Wenn wir eine Übereinstimmung haben, führen Sie eine laufende Summe
{for (senior_or_junior in student)
  {if ($2 == senior_or_junior)
  student[senior_or_junior]++}}

# Verarbeitung abgeschlossen, also drucken Sie die Übereinstimmungen aus..für jedes Array
ENDE {für (Farbe im Gürtel) print „Der Verein hat“, Gürtel[Farbe], Farbe, „Gürtel“

für ( senior_or_junior in student) print „Der Club hat“, student[senior_or_junior], senior_or_junior, „students“处理文件,先给数组命名为Farbe, 使用循环语句比对$1是否等于数组元素之一 (Gelb, Orange, Rot), 如果匹配, 依照匹配元素将运行总数保存进数组.同样的方法处理数组senior_or_junior.END部分打印浏览结果,对每一个数组使用循环语句并打印

收集awk的一些技巧方案

awk [opion] 'awk_script' input_file1 [input_file2 ... ] awk的常用选项option有:

① -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,wak使用环境变量IFS的值。 
② -f Dateiname: Der Dateiname wird von awk_script verwendet.
③ -v var=value : 为awk_script设置变量.

1、删除重复的行 

#awk '!a[]++'

2 、将数据文件中的每个词的第一个字母变成大写

dingyi@backup:~$ cat test

Linux lebe!!! 
ich bin ein Cuer

dingyi@backup:~$ awk ',1,1); sub(/^./,toupper(first),); print }' test
Linux lebe!!! 
Ich bin ein Cuer

awk 请教

下面是文件二,文件二

  $cat file1
00001       20
00002      . 31
00003       04
00004       56
00005       94
00006       73
00007       25
00008       86
00009       19
00010       52

$cat file2

00001       20
00007      28的$2不同的话, 取出全局$0?
注意:比较两个文件的$2的时候,一定要第一列相同的情况下才比较

请大虾执教

li2002 2003-9-11 08:57

awk Bitte sag es mir

Geht es nicht nur darum, die verschiedenen Zeilen herauszufinden?
cat file1 file2|sort |uniq -u

deathcult 2003-9-11 09:15

awk bitte fragen

paste file1 file2|awk '{if(($1==$3)&&($2 !=$4))print$0 }'

bjgirl 2003-9-11 09:38

awk, bitte fragen Sie

[code]
#!/bin/ ksh
sort -n file1> ;nf
sort -n file2>mf
paste nf mf|awk '$1=$3 {print}'|awk '$2!=$4 {print}'
rm nf mf
Ergebnis:
00002 31 00002 32
00004 04 00004 56
00007 56 00007 28
00010 94 00010 52
[/code]

Killua 2003 -9 -11 10:05

awk Bitten Sie um Rat

Gehen Sie zurück in den ersten Stock, ich lerne kürzlich awk und der Wert, den Sie erhalten, ist
00002 31
00002 32
00003 04
00005 94
00006 73
00007 25
00007 28
00008 86
00009 19
00010. 52
00010 52
Und was ich will ist
00002 31 32
00007 25 28


Der zweite Stock hat keinen Wert und sollte aus Kleister bestehen file1 file2|awk '{if ($1 == $3 && $2 != $4) print $0}'[/quote]


awk Bitte sagen Sie mir

Die Antwort im dritten Stock ist falsch. Wenn das Ergebnis

[color=red]00002 31 32
00007 25 28
[/color]
ist, ist $1 das Gleiche, aber $2 das ist anders

admirer 2003-9-12 00:45

awk Bitten Sie um Rat

Dies ist kein Problem, das durch einfaches Einfügen gelöst werden kann, sondern ein damit verbundenes Problem nach Stichworten!
[code]sort file1 >f1;sort file2 >f2; join -j1 1 f1 f2|awk '$2 != $3'
00002 31 32
00007 25 28[/code]

killua 2003-9-12 03:30



awk bitte um Rat

[Zitat][i]Originalbeitrag von „yoof“ ]join -j1 1 f1 f2 Bitte erläutern[/quote Gepostet von:[/i]

Verwenden Sie das erste Feld der ersten Datei als Indexschlüssel, um die beiden Dateien f1 und f2 zu verbinden

Dateiverarbeitung

1. Es gibt eine Datei gz.txt (Gehalt)

4367422926350133100 Zhang San 1250,00

4367422926351220178 Li Si 1300,00.

4367422926351220 546 Wang Er 0

Su Wubing 1340,00

4367422926351220178 So. Juni 1390.00

…… ……

Anforderungen: Ordnen Sie nach 19 Ziffern der Kontonummer, 8 Ziffern des Namens und 8 Ziffern des Gehalts und ggf Der Name ist weniger als 8-stellig und wird nachgeholt. Wenn das Gehalt weniger als 8-stellig ist, wird es vor dem Gehalt nachgeholt. Gleichzeitig ist es erforderlich, die Liste mit einem Gehalt von 0 zu entfernen. Wenn kein Konto vorhanden ist, fügen Sie vorne 19 Leerzeichen hinzu und geben Sie das Gesamtgehalt zur Überprüfung aus. Nach der Verarbeitung sollte es wie folgt angeordnet sein:

4367422926350133100 Zhang San 1250,00

4367422926351220178 Li Si 1300,00

Su Wubing 1340,00 220178 So Juni 1390.00

…… ……

awk-Programm:

#-- ----------------------------------

#shgz1.sh

sblank=" "

awk '$nf!="0"' $1 > #Löschen Sie die Anzahl der Personen mit einem Gehalt von 0

awk '<

if ($1!~/[0-9]/)<

printf("%-19.19s%-8.8s %8.2fn","'"$kk"'",$1,$2)> ; #Wenn kein Konto vorhanden ist, füllen Sie die Leerzeichen aus

else<

printf("%- 19.19s%-8.8s%8.2fn",$1,$2,$3)>

>' tmp.txt > $2

awk '$nf~/[0-9 ]/<

sum=sum+$nf

>

system("rm tmp.txt")

printf("the sum is%16.2f!n", sum) #Geben Sie das Gesamtgehalt aus

>' $2


Beim Aufrufen von Systemvariablen müssen einfache Anführungszeichen verwendet werden in awk. Wenn es sich um doppelte Anführungszeichen handelt, bedeutet dies, dass die Zeichenfolge
Flag=abcd
awk '{print '$Flag'}' ist. Das Ergebnis ist abcd

awk '{print "$Flag"}' Ergebnis ist $Flag





So entfernen Sie Inhalte zwischen Übereinstimmungen, schließen aber übereinstimmende Zeilen aus


Ich habe eine solche Datei:
Query=4567879
sequence jkaskdjgkjasgasa;jghsafgkas
jfaklslgjdla;;gsdakl;gd

Score 🎜>PUT-ASD-WEQER5-001789
>PUT-ASD-WEETED-001
SDAGDSDS
>PUT-ASD-WEQER5-001789
DSGTSDTEW
.....
......
. .....
ist so, ich möchte alle Zeilen von
von Partitur E
bis zur ersten Zeile löschen, die mit > beginnt, aber mit Ausnahme der Zeile Partitur E und der ersten Zeile, die mit > beginnt ;
verwenden Sie
sed '/score E/,/^>/d' urfile
wird definitiv nicht funktionieren, setzen Sie die Zeile „Score E“ und löschen Sie auch die erste Zeile, die mit > beginnt.
Wie schreibe ich es?
Die zu verarbeitende Datei enthält mehrere Partituren, die mit > beginnen.


awk -v p=1 '/score/{p=0}/>/{p=1}p' urfile



Weitere Artikel zu awk-Befehlen und Beispielen finden Sie auf der chinesischen PHP-Website!

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