Der Befehl wc — kurz für word count — zählt Zeilen, Wörter, Bytes, Zeichen und die Länge der längsten Zeile in einer Datei oder einem Datenstrom. Ohne Optionen liefert er drei Zahlen: Zeilen, Wörter und Bytes. Mit gezielten Schaltern wird daraus ein vielseitiges Werkzeug für Pipes, Auswertungen und kleine Sanity-Checks.
Was wc macht
wc liest entweder eine oder mehrere Dateien — oder, wenn keine Datei angegeben ist, von stdin. Standardmäßig gibt der Befehl drei Werte aus, gefolgt vom Dateinamen: Zeilen, Wörter, Bytes.
wc /etc/passwd 47 89 2891 /etc/passwdEine Zeile in der Sprache von wc ist alles, was mit einem Newline-Zeichen (\n) abgeschlossen wird. Ein Wort ist eine durch Whitespace getrennte Sequenz von Nicht-Whitespace-Zeichen. Bytes sind tatsächliche Bytes auf der Platte — nicht zwingend Zeichen, dazu gleich mehr.
Optionen
| Option | Wirkung |
|---|---|
-l | Gibt nur die Anzahl der Zeilen aus |
-w | Gibt nur die Anzahl der Wörter aus |
-c | Gibt nur die Anzahl der Bytes aus |
-m | Gibt die Anzahl der Zeichen aus (Multibyte-aware via Locale) |
-L | Gibt die Länge der längsten Zeile aus (in Zeichen) |
--files0-from=F | Liest die Dateinamen NUL-getrennt aus der Datei F |
Mehrere Optionen lassen sich kombinieren: wc -lw zeigt Zeilen und Wörter. Ohne Optionen entspricht das Verhalten -lwc.
wc -l /var/log/syslogBytes vs. Zeichen
Hier liegt eine der häufigsten Verwirrungen rund um wc. Die Option -c zählt Bytes, -m zählt Codepoints (Zeichen) gemäß aktuellem Locale. Bei reinen ASCII-Texten ist das Ergebnis identisch — bei UTF-8-Dateien mit Umlauten, Emojis oder anderen Multibyte-Zeichen klafft eine Lücke.
echo 'äöü' | wc -c
echo 'äöü' | wc -m7
4-c liefert 7 (drei Umlaute zu je 2 Bytes plus das Newline von echo), -m zeigt 4 (drei Zeichen plus Newline). Wer die Länge eines Textes in einer für Menschen sinnvollen Einheit braucht, will fast immer -m, nicht -c.
Mehrere Dateien
Bekommt wc mehrere Dateien, gibt es für jede einzelne eine Zeile aus und hängt am Ende eine Total-Zeile an.
wc *.log 120 1430 18234 access.log
42 389 5120 error.log
18 210 2480 debug.log
180 2029 25834 totalDie Total-Zeile erscheint immer dann, wenn mehr als eine Datei verarbeitet wurde — auch in Kombination mit -l, -w oder -c.
Praxis-Patterns
Ein paar Standardanwendungen, die im Alltag immer wieder auftauchen:
- Zeilen einer Datei —
wc -l datei.txtist der schnellste Weg zur Zeilenzahl, ohne die Datei zu öffnen. - Treffer in Pipes zählen —
grep ERROR app.log | wc -lliefert die Anzahl der Fehlerzeilen in einem Log. - Wortzahl eines Texts —
wc -w aufsatz.mdfür eine schnelle Schätzung, etwa für Längenvorgaben. - Anzahl Dateien (mit Vorsicht) —
ls | wc -list der Klassiker, aber unzuverlässig (siehe Pitfalls). Robuster:find . -maxdepth 1 -type f | wc -l. - Längste Zeile finden —
wc -L quellcode.pyzeigt die Länge der breitesten Zeile, hilfreich bei Style-Checks.
grep -c ERROR app.log
grep ERROR app.log | wc -l17
17Beide Varianten liefern dasselbe Ergebnis — grep -c ist allerdings schneller, weil keine zweite Pipe-Stufe nötig ist.
Stolperfallen
ls | wc -l zählt Einträge nicht zuverlässig
Der Klassiker zum Zählen von Dateien hat ein Problem: Wenn ein Dateiname ein Newline-Zeichen enthält (in Linux erlaubt!), zählt ls | wc -l diese Datei doppelt oder mehrfach. Robuster ist find . -maxdepth 1 -mindepth 1 -printf ’.’ | wc -c oder mit NUL-Trennung find . -maxdepth 1 -mindepth 1 -print0 | tr -d -c ‘\0’ | wc -c — beide ignorieren Sonderzeichen in Namen.
wc -l zählt Newlines, nicht Zeilen
wc -l zählt streng genommen die Anzahl der Newline-Zeichen (\n) in der Datei. Endet eine Datei ohne abschließenden Newline, wird die letzte „Zeile” schlicht nicht mitgezählt. Eine Datei mit dem Inhalt hallo (ohne \n) ergibt wc -l = 0, obwohl visuell eine Zeile da ist. Mit awk ‘END{print NR}’ datei bekommst du die korrekte logische Zeilenzahl.
-c und -m liefern bei UTF-8 unterschiedliche Werte
Wer -c für „Zeichenanzahl” hält, liegt bei UTF-8-Texten falsch. -c sind Bytes, -m sind Zeichen (Codepoints). Ein deutscher Text mit Umlauten ist in -c deutlich länger als in -m. Für menschen-relevante Längenangaben fast immer -m verwenden — und das Locale (locale) muss auf UTF-8 stehen, sonst fällt -m auf Byte-Zählung zurück.
Wort heißt nur whitespace-getrennt
wc -w hat keinen semantischen Wort-Begriff. Alles, was zwischen zwei Whitespace-Sequenzen steht, ist ein „Wort” — auch —foo, 123, !!! oder eine URL. Bindestrich-Wörter wie „state-of-the-art” zählen als ein Wort, „state - of - the - art” als sieben. Für echte sprachliche Wortzahlen taugt wc -w nur als grobe Schätzung.
wc < file zeigt keinen Dateinamen
Wenn du wc per Redirection statt per Argument fütterst, taucht kein Filename in der Ausgabe auf — weil wc aus stdin liest und keinen Namen kennt. wc datei.txt ergibt 3 12 80 datei.txt, wc < datei.txt hingegen nur 3 12 80. In Skripten ist die zweite Form oft praktischer, weil das Parsing einfacher wird.
Mehrere Dateien per Redirection sind nicht möglich
Eine Pipe oder Redirection liefert immer genau einen Stream. wc < a.txt b.txt ist daher kein gültiger Aufruf für „beide Dateien zählen” — die Shell gibt nur a.txt an wc weiter, b.txt wird zum Argument und wirft die Total-Zeile nicht. Wer mehrere Dateien per stdin braucht, muss cat a.txt b.txt | wc schreiben — verliert dann aber die einzelnen Zwischenstände.
Weiterführende Ressourcen
Externe Quellen
- wc(1) – Linux man page — Offizielle Dokumentation des wc-Befehls
- GNU Coreutils: wc invocation — Vollständige Beschreibung der GNU-Variante mit allen Optionen
- Arch Wiki: Core utilities — Überblick über wc und verwandte Coreutils
- POSIX wc specification — Der portable Standard
Verwandte Artikel
- cat – Dateien ausgeben — Häufiger Lieferant für wc-Pipes
- head – die ersten Zeilen einer Datei zeigen — Anfang einer Datei inspizieren
- tail – die letzten Zeilen einer Datei zeigen — Das Gegenstück zu head
- find – Dateien im Dateisystem suchen — Robuster Ersatz für ls in Pipes
- sort – Zeilen sortieren — Klassischer Pipe-Partner für wc