Linux / Befehl awk: Text nach Feldern analysieren
awk teilt Eingaben in Datensätze und Felder auf und druckt oder berechnet Werte, die Bedingungen erfüllen. Es ist nützlich zum Extrahieren von Spalten, zum Aggregieren von Protokollen und zum Erstellen einfacher Berichte.
Der Standarddatensatz ist eine Zeile, und der Standardfeldtrenner ist eine Folge von Leerzeichen. Die gesamte aktuelle Zeile wird als $0 bezeichnet, das erste Feld als $1, die Anzahl der Felder als NF und die kumulierte Zeilennummer als NR. Geben Sie einen Trenner mit -F entsprechend der Eingabe an.
Grundlegende Syntax
awk [options] 'pattern { action }' [file...]
Installierte Implementierungen und Optionen können je nach Distribution variieren. Überprüfen Sie die Beschreibung Ihres aktuellen Systems mit man awk.
Verwenden Sie eine Eingabe, um Felder, Filter und Summen zu überprüfen
Führen Sie den gesamten Block aus: Er bereitet jede Eingabe in einem neuen temporären Verzeichnis innerhalb eines Subshells vor und gibt dieses Verzeichnis am Ende aus. Er überschreibt keine Dateien im aktuellen Arbeitsverzeichnis. Prüfen Sie die Ergebnisse und entfernen Sie die Labordaten nur, wenn sie nicht mehr benötigt werden.
(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
printf 'name amount\nAna 12\nBob 7\nCara 11\n' > amounts.txt
awk 'NR > 1 {print $2}' amounts.txt
awk 'NR > 1 && $2 >= 10 {print $1}' amounts.txt
awk 'NR > 1 {sum += $2} END {print sum}' amounts.txt
printf 'Dana missing\n' >> amounts.txt
awk 'NR == 1 {next}
NF != 2 || $2 !~ /^[0-9]+([.][0-9]+)?$/ {
print "invalid row " NR ": " $0 > "/dev/stderr"
bad = 1; next
}
{sum += $2}
END {if (bad) exit 1; print sum}' amounts.txt || test "$?" -eq 1
printf 'Lab files: %s\n' "$labdir"
)
Die zweite Spalte nach der Kopfzeile ist 12, 7, 11; der Filter wählt Ana und Cara aus; die Summe ist 30. Nachdem Dana als fehlend angehängt wird, meldet die Validierung Zeile 5 als ungültig auf dem Standardfehler und druckt keine erfolgreiche Gesamtsumme. Diese Validierung akzeptiert nur das nicht negative Dezimalformat des Beispiels; passen Sie es für negative Zahlen, Exponenten oder länderspezifische Dezimalzahlen an. Fügen Sie nicht stillschweigend Kopfzeilen, fehlende Werte oder beliebige Zeichenfolgen als Null hinzu.
Hauptoptionen und Format
| Optionen/Format | Beschreibung |
|---|---|
-F delimiter |
Legt das Trennzeichen für Eingabefelder fest. |
-v name=value |
Gibt einen Anfangswert für eine awk-Variable weiter. |
BEGIN |
Muster, das vor dem Lesen der ersten Eingabezeile ausgeführt wird. |
END |
Muster, das nach der Verarbeitung der letzten Eingabezeile ausgeführt wird. |
Vorsichtsmaßnahmen bei der Verwendung
awk -F, kann CSV-Dateien mit Kommata innerhalb von Anführungszeichen nicht korrekt parsen. Wenn Ihre Eingabe CSV ist, verwenden Sie einen speziellen Parser. Funktionen, die speziell für GNU gawk entwickelt wurden, funktionieren möglicherweise nicht in anderen awk-Implementierungen.
Häufig gestellte Fragen
Was ist der Unterschied zwischen $0 und $1 in awk?
$0 ist der gesamte aktuelle Datensatz, und $1 ist das erste Feld.
Offizielle Dokumentation
Sie können das genaue Verhalten von Optionen und Unterschiede zwischen Implementierungen in der offiziellen awk-Dokumentation nachprüfen.




