wc-Befehl: Zeilen und Wörter zählen und wc -l mit Pipes nutzen
Der Befehl wc ist ein Linux-Befehl, der die Anzahl der Zeilen, Wörter und Bytes einer Datei zählt und ausgibt. Zählst du die Zeilen einer Beispieldatei mit dem Zugriffslog eines Webservers mit wc -l, erhältst du 10, und wenn du mit grep nur die 404-Antworten herausfilterst und an wc -l weitergibst, siehst du die Zahl der fehlgeschlagenen Anfragen, 3, als einzelne Zahl.
Die Logs, Dateiinhalte und der Arbeitsordner /root/work unten sind Beispielwerte. Das Log ist eine zehnzeilige Datei mit IP-Adressen, die für Dokumentation reserviert sind, und auch die anderen Dateien wurden alle zum Testen erstellt.
1️⃣ Grundlegende Verwendung des wc-Befehls und seine Ausgabe lesen
Die Grundform des Befehls ist wc, dann Optionen, dann Dateien. Gibst du nur eine Datei ohne Optionen an, gibt wc nacheinander Zeilenzahl, Wortzahl und Bytezahl aus und hängt am Ende den Dateinamen an.
cd /root/workwc access.log 10 100 766 access.logIm Ergebnis für das Zugriffslog ist 10 die Zeilenzahl, 100 die Wortzahl und 766 die Bytezahl.
Wenn du nur eine Zahl sehen willst, hängst du eine der Optionen -l, -w oder -c an.
wc -l access.log10 access.logwc -w access.log100 access.logwc -c access.log766 access.logGibst du eine Datei an, die es nicht gibt, erscheint eine Fehlermeldung und der Exit-Code ist 1.
wc nosuch.txtwc: nosuch.txt: No such file or directoryecho $?12️⃣ Zeilen zählen mit wc -l und Pipes
Wenn beim Zählen der Zeilen auch der Dateiname mit ausgegeben wird, musst du den Namen noch einmal abschneiden, wenn du die Zahl in einer Skriptvariablen speicherst. Übergibst du die Datei per Umleitung (<) oder Pipe, kennt wc den Dateinamen nicht und gibt nur die Zahl aus.
wc -l < access.log10cat access.log | wc -l10Setzt du grep vor die Pipe, kannst du nur die Zeilen zählen, die eine Bedingung erfüllen. Gesucht wurde mit den Leerzeichen vor und nach dem Antwortcode 404, und drei Zeilen enthielten 404.
grep ' 404 ' access.log | wc -l3Um zu zählen, wie viele IPs zugegriffen haben, schneidest du nur das erste Feld aus, entfernst doppelte Zeilen mit sort -u und zählst dann. Im zehnzeiligen Log gab es vier verschiedene IPs.
cut -d ' ' -f 1 access.log | sort -u192.0.2.10
192.0.2.44
198.51.100.7
203.0.113.25cut -d ' ' -f 1 access.log | sort -u | wc -l4wc -l zählt die Zeilenumbruchzeichen. Deshalb gibt wc -l bei einer Datei ohne Zeilenumbruch am Ende der letzten Zeile 1 aus, obwohl cat zwei Zeilen zeigt.
cat no-newline.txtfirst line
last linewc -l no-newline.txt1 no-newline.txtWenn die Zeilenzahl um eins zu niedrig ist, prüfe zuerst, ob die letzte Zeile mit einem Zeilenumbruch endet.
3️⃣ wc-Optionen und Zeichenzahl mit -c und -m
In UTF-8 belegen englische Buchstaben und Ziffern 1 Byte pro Zeichen, koreanische Zeichen (Hangul) und ☕ dagegen je 3 Bytes. Bei einer Datei nur mit englischem Text sind die mit -c gezählte Bytezahl und die mit -m gezählte Zeichenzahl deshalb gleich, sobald Koreanisch dazukommt, unterscheiden sich die beiden Zahlen. Verglichen wird mit einer Datei mit zwei Zeilen koreanischer Menünamen und einer Zeile auf Englisch.
cat menu.txt아메리카노
카페 라테 ☕
teawc -c menu.txt38 menu.txtwc -m menu.txt18 menu.txt-c ergab 38 und -m ergab 18, also 20 Unterschied. Das sind die 2 zusätzlichen Bytes, die jedes der neun koreanischen Zeichen und ☕ belegt. Bei einer Datei mit Koreanisch zählst du deshalb mit -m, damit die Zahl zur tatsächlichen Zeichenzahl passt. Gemessen wurde in der Locale C.UTF-8, und laut Handbuch zählt -m in den Zeicheneinheiten der Locale.
-L gibt die Anzeigebreite der längsten Zeile aus. Im Zugriffslog war die längste Zeile 82 Spalten breit; in der Menüdatei belegen koreanische Zeichen und ☕ je zwei Spalten, deshalb ergab eine Zeile mit 7 Zeichen 12.
wc -L access.log82 access.logwc -L menu.txt12 menu.txtLateinische Buchstaben mit Akzent belegen in UTF-8 2 Bytes pro Zeichen. Gemessen wurde das gesondert mit einer Datei, die nur die eine Zeile café enthält.
cat cafe.txtcaféwc -c cafe.txt6 cafe.txtwc -m cafe.txt5 cafe.txt-c ergab 6 und -m ergab 5, weil das eine é ein Byte mehr belegte. Englische Buchstaben und Ziffern belegen 1 Byte, Buchstaben mit Akzent wie é 2 Bytes, koreanische Zeichen und ☕ 3 Bytes, deshalb unterscheidet sich die Bytezahl auch bei gleicher Zeichenzahl.
Die Tabelle fasst den passenden Befehl für jede Aufgabe und die in diesem Artikel gezählte Zahl zusammen.
| Aufgabe | Befehl | Gemessen in diesem Artikel |
|---|---|---|
| Nur die Zeilenzahl als Zahl erhalten | wc -l < access.log | 10Nur die Zahl, ohne Dateinamen |
| Zeilen zählen, die eine Bedingung erfüllen | grep ‘ 404 ‘ access.log | wc -l | 3Zeilen mit 404-Antwort |
| Verschiedene Werte zählen | cut -d ‘ ‘ -f 1 access.log | sort -u | wc -l | 4Anzahl verschiedener IPs |
| Dateigröße prüfen | wc -c access.log | 766Bytezahl |
| Zeichenzahl einer Datei mit Koreanisch | wc -m menu.txt | 1838, wenn dieselbe Datei mit -c gezählt wird |
| Anzeigebreite der längsten Zeile | wc -L access.log | 8212 in der Menüdatei, die jedes koreanische Zeichen als zwei Spalten zählt |
| Summe der Zeilen mehrerer Dateien | wc -l *.log | 13Summe in der total-Zeile |
4️⃣ Summe mehrerer Dateien mit Linux wc
Gibst du mehrere Dateien an, gibt wc pro Datei eine Zeile aus und fügt in der letzten Zeile die Summe als total hinzu. Zählst du Zugriffslog und Fehlerlog zusammen, ist die 13 in der total-Zeile die Summe der Zeilen beider Dateien.
wc access.log error.log 10 100 766 access.log
3 11 76 error.log
13 111 842 totalUm Logs mit derselben Endung auf einmal zu zählen, verwendest du ein Platzhalterzeichen. Die Shell ersetzt *.log durch die Dateinamen und übergibt sie, deshalb ist das Ergebnis dasselbe, als würdest du jeden Dateinamen einzeln angeben.
wc -l *.log 10 access.log
3 error.log
13 totalAuch Dateien mit unterschiedlichen Endungen zählst du auf einmal, wenn du ihre Namen hintereinander angibst. Die beiden Logs und die Menüdatei zusammen ergaben total 16.
wc -l access.log error.log menu.txt 10 access.log
3 error.log
3 menu.txt
16 total🔲 Simulator für den wc-Befehl
Im Simulator unten kannst du wc selbst mit den Beispieldateien aus dem Artikel eingeben. Mit den Chips probierst du -l, -m und das Zählen über eine Pipe aus, und wenn du access.log eine Zeile hinzufügst und erneut zählst, erscheint die höhere Zahl.
🔢 FAQ & empfohlene Inhalte
Linux · Text
Linux-sort-Befehl: Dateien sortieren
Optionen und Beispiele für sort, um Dateiinhalte alphabetisch oder auf- und absteigend zu sortieren.
Linux · Text
Linux-uniq-Befehl
So verwendest du uniq, um von doppelten Zeilen nur eine zu behalten und mit -c zu zählen, wie oft sie vorkommen.
Linux · Text
Linux-Befehle head und tail
Optionen und Verwendung von head, das die ersten 10 Zeilen einer Datei ausgibt, und tail, das die letzten 10 Zeilen ausgibt.
ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.