Datensätze, Felder und benutzerdefinierte Trennzeichen in awk
Steuern Sie Eingabe- und Ausgabefeldtrenner, um CSV-, TSV- und Protokollzeilen in übersichtliche Spalten aufzuteilen.
Datensätze, Felder und benutzerdefinierte Trennzeichen in awk ist eine kostenlose Linux Command Line & Bash Scripting Mastery-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Linux Command Line & Bash Scripting Mastery-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Linux Command Line & Bash Scripting Mastery-Kurs umfasst insgesamt 4 Lektionen.
Was sind Datensätze und Felder in awk?
awk liest die Eingabe Zeile für Zeile. Jede Zeile wird als Datensatz bezeichnet, und jeder durch Leerraum getrennte Abschnitt innerhalb dieser Zeile heißt Feld.
$0– der gesamte aktuelle Datensatz (die vollständige Zeile)$1– das erste Feld$2– das zweite Feld$NF– das letzte Feld (NF= Anzahl der Felder)
Standardmäßig teilt awk Felder an jeder Folge von Leerraumzeichen (Leerzeichen oder Tabulatoren). Dadurch eignet sich awk sofort zum Parsen von Protokollen, Kommandoausgaben und durch Leerzeichen getrennten Daten.
#!/usr/bin/env bash
# Show how awk sees records and fields
echo 'alice 30 engineer' | awk '{ print "Name:", $1, "Age:", $2, "Role:", $3 }'
# $NF is always the last field — regardless of how many there are
echo 'one two three four five' | awk '{ print "Last field:", $NF }'Der Eingabefeldtrenner: FS
Die integrierte Variable FS (Field Separator, Feldtrenner) teilt awk mit, wie jeder Datensatz in Felder aufgeteilt wird. Der Standardwert ist ein einzelnes Leerzeichen, wodurch der Modus zur Aufteilung an Leerraum aktiviert wird.
Sie können FS auf zwei Arten festlegen:
- Mit dem Flag
-Fin der Kommandozeile:awk -F':' - Innerhalb eines
BEGIN-Blocks:BEGIN { FS = ":" }
Beide Varianten sind gleichwertig. Bei längeren Skripten wird der Ansatz mit einem BEGIN-Block bevorzugt, weil die Konfiguration dadurch im Skript selbst bleibt und besser lesbar und portabler ist.
#!/usr/bin/env bash
# Parse /etc/passwd using ':' as the field separator
# Field 1 = username, field 3 = UID, field 7 = shell
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin' \
| awk -F':' '{ print $1, "UID="$3, "shell="$7 }'FS im BEGIN-Block festlegen
Bei Skripten, die länger als eine einzelne Zeile sind, ist es üblich, FS in einem BEGIN-Block zu platzieren. Der BEGIN-Block wird vor dem Einlesen jeglicher Eingabe durch awk ausgeführt, sodass der Trenner für den ersten Datensatz bereitsteht.
Mit diesem Muster können Sie außerdem mehrere Variablen gleichzeitig festlegen, Kommentare hinzufügen und Ihre Logik in einer Skriptdatei geschlossen halten.
Häufige Trenner, denen Sie in der Praxis begegnen:
- Doppelpunkt
:–/etc/passwd,/etc/shadow - Tabulator
\t– TSV-Exporte, Compilerausgaben - Komma
,– CSV-Dateien (einfach, ohne Anführungszeichen in Feldern) - Pipe
|– einige Protokollformate, Datenbank-Dumps
#!/usr/bin/env bash
# awk script using BEGIN to set FS for TSV input
printf 'alice\t30\tengineer\nbob\t25\tdesigner\ncarol\t35\tmanager\n' \
| awk 'BEGIN { FS = "\t" } { printf "%-10s age=%-3s role=%s\n", $1, $2, $3 }'CSV-Dateien mit awk parsen
CSV (comma-separated values, durch Kommas getrennte Werte) ist eines der häufigsten Datenformate in der Shell-Entwicklung. Wenn Sie FS="," festlegen, behandelt awk Kommas als Trennzeichen.
Wichtiger Hinweis: Die integrierte CSV-Unterstützung von awk berücksichtigt keine Anführungszeichen in Feldern, die Kommas enthalten (z. B. "Smith, John"). Für einfache CSV-Dateien ohne Kommas in Anführungszeichen funktioniert dies einwandfrei. Für RFC-4180-konforme CSV-Dateien mit Anführungszeichen in Feldern verwenden Sie einen geeigneten CSV-Parser oder miller/csvkit.
Eine häufige Aufgabe aus der Praxis besteht darin, bestimmte Spalten zu extrahieren und Zeilen nach einem Wert zu filtern – beides ist mit awk trivial, sobald FS festgelegt ist.
#!/usr/bin/env bash
# Simple CSV: extract name and salary columns, filter salary > 50000
data='name,department,salary
alice,engineering,95000
bob,marketing,48000
carol,engineering,112000
dave,hr,45000'
echo "$data" | awk -F',' '
NR == 1 { next } # skip header row
$3 > 50000 { print $1, "earns", $3 }
'Mehrzeichen- und reguläre Ausdrucks-Feldtrenner
FS in awk ist nicht auf ein einzelnes Zeichen beschränkt – es kann ein regulärer Ausdruck sein. Das ist besonders leistungsfähig bei Protokollformaten aus der Praxis, in denen Felder durch Trennzeichen variabler Länge getrennt werden.
Beispiele für Trennzeichen als reguläre Ausdrücke:
FS = "[,;]"– an Kommas oder Semikolons teilenFS = "[ \t]+"– an einem oder mehreren Leerzeichen bzw. Tabulatoren teilen (wie der Standard, aber explizit)FS = "::"– am wörtlichen doppelten Doppelpunkt teilenFS = "\\|"– am Pipe-Zeichen teilen (muss maskiert werden)
Wenn FS ein regulärer Ausdruck ist, behandelt awk (gawk) ihn als Muster und nicht als wörtliche Zeichenkette.
#!/usr/bin/env bash
# Log lines with mixed delimiters: split on " | " or "::" or ","
# Here we split on one or more spaces or pipe characters
printf '2024-01-15 | ERROR | disk full | /dev/sda1\n2024-01-15 | INFO | startup ok | main\n' \
| awk -F' \\| ' '{ printf "date=%-12s level=%-6s msg=%s\n", $1, $2, $3 }'
# Split on multiple possible delimiters using character class
echo 'alpha,beta;gamma,delta;epsilon' \
| awk -F'[,;]' '{ for(i=1; i<=NF; i++) print i": "$i }'Der Ausgabefeldtrenner: OFS
OFS (Output Field Separator, Ausgabefeldtrenner) legt fest, was awk zwischen Feldern einfügt, wenn Sie mit print einen Datensatz neu zusammensetzen. Der Standardwert ist ein einzelnes Leerzeichen.
Wichtig ist: OFS wird nur zwischen Feldern eingefügt, wenn Sie in print die Syntax mit Kommas verwenden oder wenn Sie einem Feld einen Wert zuweisen und awk dadurch $0 neu aufbaut. Wenn Sie im Quellcode mit Leerzeichen verketten, wird OFS nicht verwendet.
print $1, $2, $3– Kommas lösenOFSzwischen den Feldern ausprint $1 " " $2– explizites Leerzeichen,OFSwird ignoriert
Ein häufiges Muster: CSV einlesen, umformen und als TSV ausgeben, indem Sie FS="," und OFS="\t" festlegen.
#!/usr/bin/env bash
# Convert CSV to TSV using FS and OFS
data='alice,30,engineer
bob,25,designer
carol,35,manager'
echo "$data" | awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2, $3 }'
echo '---'
# OFS also applies when you modify a field — awk rebuilds $0 with OFS
echo 'alice,30,engineer' | awk 'BEGIN { FS=","; OFS=" | " } { $1=$1; print $0 }'awk mit OFS zum Neuaufbau von $0 zwingen
Es gibt einen subtilen, aber wichtigen Trick: Die Zuweisung an ein beliebiges Feld (selbst die Zuweisung eines Feldes an sich selbst, $1=$1) zwingt awk, $0 neu aufzubauen, indem alle Felder mit OFS verbunden werden.
Dies ist der idiomatische Weg, die Trennzeichen eines Datensatzes neu zu formatieren, ohne jedes Feld manuell auszugeben:
FSauf das Eingabetrennzeichen setzenOFSauf das gewünschte Ausgabetrennzeichen setzen- Mit
$1=$1einen Neuaufbau auslösen $0ausgeben
Dieser Ansatz funktioniert mit beliebig vielen Feldern und vermeidet fest codierte Angaben wie $1, $2, $3, ....
#!/usr/bin/env bash
# Reformat a pipe-delimited file to comma-separated WITHOUT listing every field
printf 'alice|30|engineer|london\nbob|25|designer|paris\ncarol|35|manager|berlin\n' \
| awk 'BEGIN { FS="|"; OFS="," } { $1=$1; print $0 }'
# Useful when you don't know how many fields there are:
printf 'a|b|c|d|e|f|g\n1|2|3|4|5|6|7\n' \
| awk 'BEGIN { FS="|"; OFS="\t" } { $1=$1; print $0 }'Der Datensatztrenner: RS
Ebenso wie FS die Felder innerhalb eines Datensatzes trennt, legt RS (Datensatztrenner) fest, wodurch Datensätze voneinander getrennt werden. Standardmäßig ist RS ein Zeilenumbruch, daher verarbeitet awk jeweils eine Zeile.
Durch Ändern von RS wird eine leistungsfähige Verarbeitung mehrzeiliger Datensätze möglich:
RS=""— Absatzmodus: Leerzeilen trennen Datensätze (Felder können sich über mehrere Zeilen erstrecken)RS=";"— Trennung an Semikolons (nützlich für SQL-Dumps)RS="\n"— expliziter Zeilenumbruch (Standardwert)
Im Absatzmodus (RS="") wird FS weiterhin verwendet, um die Felder innerhalb des mehrzeiligen Datensatzes zu trennen. Außerdem werden Zeilenumbrüche innerhalb eines Datensatzes automatisch ebenfalls als Feldtrenner behandelt.
#!/usr/bin/env bash
# Paragraph mode: each blank-line-separated block is one record
# Useful for processing structured text blocks (e.g., stanzas, config sections)
data='Name: Alice
Role: Engineer
City: London
Name: Bob
Role: Designer
City: Paris'
echo "$data" | awk 'BEGIN { RS=""; FS="\n" } {
print "Record", NR":"
for (i=1; i<=NF; i++) print " ", $i
print ""
}'Der Ausgabedatensatztrenner: ORS
ORS (Ausgabedatensatztrenner) wird nach jeder print-Anweisung ausgegeben. Standardmäßig ist dies ein Zeilenumbruch (\n), weshalb jeder print-Aufruf in einer neuen Zeile ausgegeben wird.
Durch Ändern von ORS können Sie:
- Datensätze in einer einzigen Zeile zusammenfügen:
ORS=" " - Leerzeilen zwischen ausgegebenen Datensätzen einfügen:
ORS="\n\n" - Benutzerdefinierte Ausgabeformate wie JSON- oder XML-Fragmente erstellen
Beachten Sie, dass printf nicht ORS verwendet — ORS gilt nur für die einfache print-Anweisung. Verwenden Sie printf, wenn Sie die Formatierung vollständig kontrollieren müssen.
#!/usr/bin/env bash
# Join all matching lines onto one line by setting ORS to a space
printf 'apple\nbanana\ncherry\ndate\n' | awk '{ ORS=" " } { print $0 }'
echo # final newline
# Add a blank line after every output record for readability
printf 'alice 30 engineer\nbob 25 designer\ncarol 35 manager\n' \
| awk 'BEGIN { ORS="\n\n" } { print $1, "is a", $3 }'Praxisbeispiel: Apache-Access-Logs analysieren
Apache-/nginx-Access-Logs haben ein bekanntes Format mit durch Leerzeichen getrennten Feldern. Einige Felder (etwa der Zeitstempel) enthalten Leerzeichen und stehen in Klammern oder Anführungszeichen — dadurch wird die direkte Feldtrennung mit awk schwierig.
Ein praktikabler Ansatz besteht darin, ein reguläres FS zu verwenden, das die Struktur berücksichtigt, oder bestimmte Felder anhand ihrer Position zu extrahieren, wenn das genaue Format bekannt ist.
Die Felder des Combined Log Format sind ungefähr:
- Client-IP-Adresse
- Ident (üblicherweise
-) - Authentifizierter Benutzer (üblicherweise
-) - Zeitstempel (in Klammern, zählt als ein Token)
- HTTP-Anfragemethode+Pfad+Protokoll (in Anführungszeichen)
- HTTP-Statuscode
- Antwortgröße in Bytes
#!/usr/bin/env bash
# Parse a simulated Apache Combined Log Format line
# Extract: IP, status code, bytes, and request path
logs='192.168.1.10 - alice [15/Jan/2024:10:23:45 +0000] "GET /api/users HTTP/1.1" 200 1523
10.0.0.5 - - [15/Jan/2024:10:23:46 +0000] "POST /login HTTP/1.1" 401 89
172.16.0.3 - bob [15/Jan/2024:10:23:47 +0000] "GET /dashboard HTTP/1.1" 200 8741'
echo "$logs" | awk '{
ip = $1
status = $9
bytes = $10
# Extract the request path from the quoted string in field 7
split($7, parts, "/")
path = "/" parts[2]
printf "ip=%-15s status=%s bytes=%-6s endpoint=%s\n", ip, status, bytes, path
}'FS, OFS, RS und ORS in einer Pipeline kombinieren
In der praktischen Shell-Entwicklung verwenden Sie diese Trenner nur selten isoliert. Ein häufiges Pipeline-Muster besteht darin, awk in der Mitte einer Pipeline als Formatkonverter einzusetzen, der ein strukturiertes Format in ein anderes umwandelt.
Wichtige Punkte beim Kombinieren der Trenner:
- Setzen Sie
FSundOFSbeim Konvertieren von Formaten immer gemeinsam inBEGIN. - Verwenden Sie
$1=$1, um den Neuaufbau von$0auszulösen, wenn alle Felder neu formatiert werden sollen, ohne sie einzeln aufzulisten. - Ändern Sie
RSnur, wenn sich Ihre Datensätze tatsächlich über mehrere Zeilen erstrecken. - Verwenden Sie
ORS, um die Abstände zwischen ausgegebenen Datensätzen zu steuern. - Bevorzugen Sie
printffür eine präzise Formatierung; verwenden Sieprint, wenn die automatische Beendigung durchORSpraktisch ist.
#!/usr/bin/env bash
# Full pipeline: read a colon-delimited file,
# filter rows where field 3 (UID) >= 1000 (real users),
# then output as tab-separated: username, UID, home dir
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
alice:x:1001:1001:Alice:/home/alice:/bin/bash
bob:x:1002:1002:Bob:/home/bob:/bin/zsh
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin' \
| awk 'BEGIN { FS=":"; OFS="\t" } $3 >= 1000 { print $1, $3, $6 }'Wissenscheck: OFS und der Neuaufbau von Feldern
Testen Sie Ihr Verständnis davon, wie OFS mit der Zuweisung von Feldern in awk zusammenwirkt.
Lektionsrückblick: Datensätze, Felder und Trenner
Sie haben nun vollständige Kontrolle darüber, wie awk strukturierte Daten liest und schreibt. Hier ist eine Zusammenfassung der vier Trenner-Variablen:
FS— Eingabefeldtrenner. Wird mit-Foder inBEGINgesetzt. Kann ein Zeichen, eine Zeichenkette oder ein regulärer Ausdruck sein. Standardwert: Leerraum.OFS— Ausgabefeldtrenner. Wird zwischen Felder inprint $1, $2-Aufrufen eingefügt und wenn awk$0nach einer Feldzuweisung neu aufbaut. Standardwert: ein einzelnes Leerzeichen.RS— Eingabedatensatztrenner. Legt fest, wodurch Datensätze (Zeilen) getrennt werden. Standardwert: Zeilenumbruch. Für den Absatzmodus auf eine leere Zeichenkette setzen.ORS— Ausgabedatensatztrenner. Wird an jedesprint-Ergebnis angehängt. Standardwert: Zeilenumbruch. Kann geändert werden, um Zeilen zu verbinden oder Abstände einzufügen.
Das wichtigste Muster zum Merken: Setzen Sie FS und OFS beide in BEGIN und verwenden Sie anschließend $1=$1, um $0 neu aufzubauen, wann immer Sie die Trennzeichen in allen Feldern neu formatieren möchten, ohne Feldpositionen fest zu codieren. Dieses Muster funktioniert für Dateien mit beliebig vielen Spalten und bildet die Grundlage von Pipeline zur Formatkonvertierung mit awk.
Häufig gestellte Fragen
Ist die Lektion „Datensätze, Felder und benutzerdefinierte Trennzeichen in awk“ kostenlos?
Ja — der vollständige Text von „Datensätze, Felder und benutzerdefinierte Trennzeichen in awk“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Linux Command Line & Bash Scripting Mastery-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Linux Command Line & Bash Scripting Mastery-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Datensätze, Felder und benutzerdefinierte Trennzeichen in awk“?
Steuern Sie Eingabe- und Ausgabefeldtrenner, um CSV-, TSV- und Protokollzeilen in übersichtliche Spalten aufzuteilen. Du übst Linux Command Line & Bash Scripting Mastery mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Linux Command Line & Bash Scripting Mastery zu starten?
Keine Vorkenntnisse erforderlich. Linux Command Line & Bash Scripting Mastery auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Datensätze, Felder und benutzerdefinierte Trennzeichen in awk“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Linux Command Line & Bash Scripting Mastery-Lektion Code schreiben und ausführen?
Ja. Jede Linux Command Line & Bash Scripting Mastery-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Datensätze, Felder und benutzerdefinierte Trennzeichen in awk
- Muster, Bereiche und BEGIN-/END-Blöcke
- Aggregation mit awk-Arrays und Gruppierung
- awk-Funktionen, printf-Formatierung und Berichtserstellung