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.

Bash Standardausgabe von wc
wc /etc/passwd
Output
  47   89 2891 /etc/passwd

Eine 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

OptionWirkung
-lGibt nur die Anzahl der Zeilen aus
-wGibt nur die Anzahl der Wörter aus
-cGibt nur die Anzahl der Bytes aus
-mGibt die Anzahl der Zeichen aus (Multibyte-aware via Locale)
-LGibt die Länge der längsten Zeile aus (in Zeichen)
--files0-from=FLiest 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.

Bash Nur Zeilenanzahl
wc -l /var/log/syslog

Bytes 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.

Bash Drei deutsche Umlaute zählen
echo 'äöü' | wc -c
echo 'äöü' | wc -m
Output
7
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.

Bash Alle Logs zählen
wc *.log
Output
  120  1430 18234 access.log
   42   389  5120 error.log
   18   210  2480 debug.log
  180  2029 25834 total

Die 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 Dateiwc -l datei.txt ist der schnellste Weg zur Zeilenzahl, ohne die Datei zu öffnen.
  • Treffer in Pipes zählengrep ERROR app.log | wc -l liefert die Anzahl der Fehlerzeilen in einem Log.
  • Wortzahl eines Textswc -w aufsatz.md für eine schnelle Schätzung, etwa für Längenvorgaben.
  • Anzahl Dateien (mit Vorsicht)ls | wc -l ist der Klassiker, aber unzuverlässig (siehe Pitfalls). Robuster: find . -maxdepth 1 -type f | wc -l.
  • Längste Zeile findenwc -L quellcode.py zeigt die Länge der breitesten Zeile, hilfreich bei Style-Checks.
Bash Fehler im Log zählen
grep -c ERROR app.log
grep ERROR app.log | wc -l
Output
17
17

Beide 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

/ Weiter

Zurück zu Textverarbeitung

Zur Übersicht