Linux / Befehl wc: Zeilen, Wörter, Zeichen und Bytes zählen
wc ist ein Befehl, der die Anzahl der Zeilen, Wörter, Bytes und Zeichen in einer Datei oder in der Standardeingabe zählt. Wird er ohne Optionen ausgeführt, gibt er in der Reihenfolge die Anzahl der Zeilenumbrüche, Wörter und Bytes aus, und Sie können nur die Werte auswählen, die Sie benötigen, mit -l, -w, -c und -m.
Er wird oft nicht nur für einfache Statistiken verwendet, sondern auch zum Überprüfen der Anzahl der Logeinträge, zum Aggregieren von Suchergebnissen, zum Verifizieren von Datendateien und für bedingte Entscheidungen in Shell-Skripten. Sie müssen jedoch beachten, dass wc -l die Anzahl der Zeilenumbrüche zählt, nicht die auf dem Bildschirm sichtbaren Zeilen, und den Unterschied zwischen -c und -m beim Verwenden verstehen.
Was ist der Befehl wc?
wc steht für Wortanzahl und liest die gesamte Eingabe, um Zeilen, Wörter, Bytes und Zeichen zu zählen. Wenn keine Datei angegeben wird oder ein - anstelle eines Dateinamens verwendet wird, liest es von der Standardeingabe, was praktisch ist, um es über eine Pipe mit anderen Befehlen zu verbinden.
In GNU wc ist ein Wort eine nicht-leere Zeichenfolge, die durch Leerzeichen getrennt ist. Da es keine grammatikalischen Wörter oder Wörter aus einem Wörterbuch bestimmt, können auch Zeichenfolgen mit angehängter Interpunktion als ein einzelnes Wort gezählt werden.
Grundlegende Grammatik und wie man die Ausgabe liest
Die grundlegende Syntax ist wie folgt. Klammern kennzeichnen optionale Elemente und sollten im eigentlichen Befehl nicht enthalten sein.
wc [options] [file...]
Wenn Sie eine einzelne Datei ohne Optionen angeben, werden die Anzahl der Zeilen, die Anzahl der Wörter, die Anzahl der Bytes und der Dateiname angezeigt.
wc notes.txt
12 48 317 notes.txt
Das obige Ergebnis bedeutet, dass notes.txt 12 Zeilenumbrüche, 48 Wörter und 317 Bytes enthält. Der Abstand der Ausgabefelder kann je nach Eingabe variieren, daher sollten Sie das Ergebnis nicht anhand der Anzahl der Leerzeichen interpretieren.
Um nur den benötigten Wert zu sehen, geben Sie die entsprechende Option an.
wc -l notes.txt wc -w notes.txt wc -c notes.txt
Hauptoptionen von wc
| Option | Berechnungsziel | Zu beachtende Punkte |
|---|---|---|
-l, --lines |
Anzahl der Zeilenumbrüche | Wenn die letzte Zeile keinen Zeilenumbruch hat, wird diese Zeile nicht einbezogen |
-w, --words |
Anzahl der durch Leerzeichen getrennten Wörter | Die Bestimmung von Leerzeichen kann durch die Locale beeinflusst werden |
-c, --bytes |
Anzahl der Bytes | Ein Multibyte-Zeichen kann mehrere Bytes pro Zeichen haben |
-m, --chars |
Anzahl der Zeichen | Beeinflusst durch die aktuelle Locale und Zeichencodierung |
-L, --max-line-length |
Bildschirmbreite der längsten Zeile | Nicht nur eine einfache Zeichenanzahl; Tabs und breite Zeichen werden ebenfalls berücksichtigt |
--files0-from=file |
Eine Liste von Dateien, getrennt durch NUL-Zeichen | GNU-Erweiterungsoption, nützlich zum Umgang mit Dateinamen mit Sonderzeichen |
Sie können auch mehrere Optionen zusammen angeben. Die Ausgabereihenfolge wird nicht durch die Reihenfolge der Optionen bestimmt, sondern nach der Anzahl der Zeilen, Wörter, Zeichen, Bytes und der maximalen Zeilenlänge. Für die genaue Definition und GNU-Erweiterungsoptionen können Sie auf die offizielle GNU Coreutils wc Dokumentation verweisen.
Wie man die Anzahl der Zeilen genau zählt
wc -l zählt die Zeilenenden
wc -l gibt die Anzahl der Zeilenumbrüche im Eingabetext aus, nicht die logische Anzahl der Zeilen. Bei einer typischen Textdatei endet jede Zeile mit einem Zeilenumbruch, sodass das Ergebnis der Anzahl der Zeilen entspricht. Wenn jedoch die letzte Zeile keinen Zeilenumbruch hat, kann es eine weniger als die sichtbaren Zeilen sein.
wc -l access.log
Sie können prüfen, ob eine Textdatei mit einem Zeilenumbruch endet, indem Sie das letzte Byte folgendermaßen inspizieren. Wenn das Ergebnis 0a ist, endet es mit einem LF-Zeilenumbruch.
tail -c 1 notes.txt | od -An -t x1
Geben Sie nur Zahlen ohne Dateiname aus
Wenn Sie eine Datei als Argument übergeben, erscheint der Dateiname nach dem Ergebnis. Wenn Sie nur die Zahlen in einer Shell-Variable speichern möchten, verwenden Sie die Standard-Eingaberedirektion.
line_count=$(wc -l < notes.txt) printf '%s\n' "$line_count"
GNU wc zeigt Werte ohne führende Leerzeichen an, wenn nur ein Wert ausgegeben wird, aber wenn das Skript auch andere Implementierungen berücksichtigt, ist es sicherer, das Zahlenformat separat zu überprüfen.
Unterschied zwischen Byte-Anzahl und Zeichenanzahl
-c zählt Bytes
wc -c zählt die Anzahl der Bytes im Eingabedatenstrom. Es eignet sich zum Überprüfen der Dateigröße in Bytes oder zum Berechnen der tatsächlichen Größe der zu übertragenden Daten.
wc -c document.txt
Wenn Sie nur die vom Dateisystem gemeldete Größe benötigen, ist stat möglicherweise besser geeignet, da es den Wert aus den Metadaten abrufen kann, ohne die gesamte Datei lesen zu müssen.
stat -c '%s' document.txt
-m zählt Zeichen gemäß den Ländereinstellungen
wc -m zählt Zeichen basierend auf der aktuellen Gebietseinstellung und Kodierung. In UTF-8 ist ein ASCII-Zeichen 1 Byte, während ein Nicht-ASCII-Zeichen mehrere Bytes verwenden kann, sodass die Ergebnisse von -c und -m für dieselbe Datei unterschiedlich sein können.
printf 'Linux café\n' | wc -c printf 'Linux café\n' | wc -m
In einer UTF-8-Umgebung liefert das Beispiel 12 Bytes mit -c und 11 Zeichen mit -m. Prüfen Sie bei abweichenden Ergebnissen mit locale die Zeichencodierung. -m zählt Zeichen gemäß dieser Codierung, nicht zwingend vom Menschen wahrgenommene Schriftzeichen: Ein Zeichen mit kombinierendem Akzent kann aus mehreren gezählten Zeichen bestehen.
Wie wird die Wortanzahl berechnet?
wc -w zählt die Anzahl der nicht-leeren Zeichenfolgen, die durch Leerzeichen getrennt sind. Aufeinanderfolgende Leerzeichen oder Tabulatoren wirken als Trenner, und es werden keine Satzzeichen entfernt oder die Morphologie der Sprache analysiert.
printf 'one two\tthree\n' | wc -w
3
Überprüfung der Zählungen und Summen für mehrere Dateien
Ergebnisse nach Datei und die Gesamtsumme
Wenn mehrere Dateien angegeben sind, wird nach den Ergebnissen jeder Datei eine total-Zeile mit der Gesamtsumme hinzugefügt.
wc -l january.log february.log march.log
120 january.log 135 february.log 98 march.log 353 total
Angabe der Gesamtdarstellungsmethode mit der GNU-Option --total
Die neueste GNU wc ermöglicht die Steuerung der Anzeige der Summenzeile mit --total=auto, always, only oder never. Wenn nur die Gesamtzahl benötigt wird, kann sie wie folgt verwendet werden.
wc -l --total=only january.log february.log march.log
--total ist eine GNU-Erweiterung und möglicherweise in älteren Coreutils oder anderen Unix-ähnlichen Umgebungen nicht verfügbar. Wenn Portabilität erforderlich ist, prüfen Sie die Unterstützung mit wc --help und verwenden Sie eine Methode, um die letzte Zeile der vorhandenen Ausgabe zu handhaben.
Praktische Beispiele unter Verwendung von Pipes
Zählen von Suchergebniszeilen
Sie können die Anzahl der übereinstimmenden Zeilen zählen, indem Sie die Ergebnisse von grep an wc -l übergeben.
grep 'ERROR' app.log | wc -l
Wenn Sie nur die Anzahl der übereinstimmenden Zeilen in einer einzelnen Datei benötigen, ist grep -c 'ERROR' app.log direkter. Beide Methoden zählen eine Zeile nur einmal, selbst wenn das Muster mehrfach in dieser Zeile erscheint. Für detaillierte Suchmethoden siehe Linux grep command usage.
Überprüfen der Anzahl der Zeilen in CSV-Daten
Wenn die erste Zeile einer CSV-Datei Spaltennamen enthält, können Sie die Kopfzeile mit tail -n +2 überspringen und dann die Datenzeilen zählen.
tail -n +2 data.csv | wc -l
Für Dateien, bei denen echte Zeilenumbrüche innerhalb von CSV-Feldern erlaubt sind, kann ein einzelner Datensatz mehrere physische Zeilen einnehmen, sodass man die Anzahl der Datensätze auf diese Weise nicht genau zählen kann. Solche Dateien müssen mit einem CSV-Parser verarbeitet werden. Sie können die Methode zum Angeben des Bereichs in tail auf How to Use the Linux tail Command überprüfen.
Dateinamen auch bei Sonderzeichen sicher zählen
Die normale Ausgabe von find kann die Anzahl der Elemente falsch zählen, wenn Dateinamen Zeilenumbruchzeichen enthalten. In einer GNU-Umgebung können Sie Dateinamen mit einem NUL-Zeichen trennen und dann die Anzahl der NUL-Zeichen zählen.
find ./logs -type f -name '*.log' -print0 | tr -cd '\0' | wc -c
Dies ist sicherer für Dateinamen, die Leerzeichen und Zeilenumbrüche enthalten, als einfach find... | wc -l zu verwenden. Das Suchmuster *.log sollte in Anführungszeichen gesetzt werden, damit die Shell es nicht zuerst erweitert.
Überprüfen der Anzahl der laufenden Prozesse
Wenn GNU/Linux ps --no-headers unterstützt, können Sie die Zeilen der Prozessliste ohne die Kopfzeile zählen.
ps -e --no-headers | wc -l
Es handelt sich um einen Schnappschuss zum Zeitpunkt der Ausführung des Befehls, und die Ergebnisse können variieren, je nachdem, ob die eigenen Prozesse der Pipeline eingeschlossen sind oder wie ps implementiert ist. Wenn Sie es als Überwachungsmetrik verwenden, sollten Sie die Verwendung spezieller Tools oder eine auf /proc basierende Erfassungsmethode in Betracht ziehen.
Überprüfen der Länge der längsten Zeile
wc -L berechnet die maximale Breite, die auf dem Bildschirm angezeigt wird, nicht die einfache Byte-Anzahl oder die Zeichenanzahl der längsten Zeile. GNU wc berücksichtigt breite Zeichen basierend auf der aktuellen Gebietsschema-Einstellung und berechnet Tabstopps in Einheiten von 8.
wc -L table.txt
Daher sollten Sie nicht davon ausgehen, dass das Ergebnis von -L das gleiche ist wie die mit awk '{ print length }' erhaltene Zeichenlänge oder die Byte-Anzahl von wc -c. Für Aufgaben, die eine genaue Zeichenanzahl erfordern, wie z. B. Code-Stil-Prüfungen, sollten Sie zuerst die vom Tool verwendete Längendefinition überprüfen.
Sicherer Umgang mit vielen Dateien
Vermeidung von Befehlszeilenlängen-Limits
Wenn es sehr viele Dateien gibt, kann die Erweiterung von Wildcards durch die Shell das Befehlszeilen-Längenlimit überschreiten. Die Option --files0-from=- von GNU wc liest eine NUL-getrennte Liste von Dateien von der Standardeingabe, um dieses Problem zu vermeiden.
find ./logs -type f -name '*.log' -print0 | wc -l --files0-from=-
Dieser Befehl gibt die Anzahl der Zeilen in jeder Protokolldatei und die Gesamtsumme aus. Er funktioniert sicher, selbst wenn die Dateinamen Leerzeichen oder Zeilenumbrüche enthalten, da NUL-Trennzeichen verwendet werden.
Seien Sie vorsichtig bei Summen, die durch xargs aufgeteilt werden.
find... | xargs wc -l kann in mehrere wc-Ausführungen aufgeteilt werden, wenn viele Dateien vorhanden sind. In diesem Fall erzeugt jede Ausführung eine separate total, was es erschwert, die Gesamtsumme direkt abzulesen. In einer GNU-Umgebung eignet sich --files0-from=- besser, um die gesamte Liste auf einmal zu aggregieren.
Prinzipien für die Nutzung in Shell-Skripten
Fordern Sie nur den Wert an, den Sie benötigen
Teilen Sie die mehreren Spalten der wc-Ausgabe ohne Optionen nicht nach Leerzeichen auf; fordern Sie stattdessen nur den benötigten Wert mit -l, -w oder -c an. Wenn der Dateiname ebenfalls nicht benötigt wird, verwenden Sie die Eingabenumleitung.
bytes=$(wc -c < archive.dat)
Unterscheiden Sie zwischen Fehlern und 0
Das Ergebnis 0 für eine leere Datei und ein Fehler beim Lesen der Datei haben unterschiedliche Bedeutungen. Wenn Sie nur den Wert speichern, könnte Ihnen die Standardfehlermeldung oder der Exit-Status entgehen, daher sollten Sie bei wichtiger Automatisierung auch prüfen, ob der Befehl erfolgreich war.
if count=$(wc -l < input.txt); then printf 'lines=%s\n' "$count" else printf 'Could not read input.txt.\n' >&2 fi
Häufige Missverständnisse und Vorsichtsmaßnahmen
Das Ergebnis von wc -l ist um eins kleiner als erwartet
Es ist wahrscheinlich, dass die letzte Zeile nicht mit einem Zeilenumbruch endet. wc -l zählt die Zeilenumbruchzeichen, daher wird die unvollständige letzte Zeile nicht eingeschlossen. Bevor Sie das ursprüngliche Format beliebig ändern, überprüfen Sie die Ausgaberegeln des Programms, das die Datei erstellt hat.
-c und -m unterscheiden sich bei Multibyte-Zeichen
-c zählt Bytes und -m Zeichen gemäß der Codierung. Für Speichergrößen verwenden Sie -c; für codierungsbezogene Zeichenzahlen prüfen Sie Locale und Codierung und verwenden -m. Zusammengesetzte sichtbare Schriftzeichen können dabei aus mehreren gezählten Zeichen bestehen.
Kann ich die Anzahl der Dateien mit der Ausgabe von ls zählen?
Für normale Dateinamen mag ls | wc -l einfach erscheinen, ist aber aufgrund von Aliasen, Ausgabeformaten und Dateinamen mit Zeilenumbrüchen nicht für die Automatisierung geeignet. Verwenden Sie find, um Dateitypen und Suchtiefe anzugeben, und wählen Sie bei der Verarbeitung beliebiger Dateinamen die NUL-getrennte Methode.
Häufig gestellte Fragen
Was passiert, wenn Sie wc ohne Optionen ausführen?
Standardmäßig werden die Anzahl der Zeilen, Wörter und Bytes in dieser Reihenfolge ausgegeben. Wenn Sie eine Datei als Argument angeben, wird am Ende auch der Dateiname angezeigt.
Was ist das wc-Ergebnis für eine leere Datei?
Eine leere Datei ohne Inhalte hat 0 für Zeilen, Wörter und Bytes. Eine Datei mit nur einem Zeilenumbruch zeigt 1 für das wc -l-Ergebnis an, und die Anzahl der Bytes kann je nach verwendetem Zeilenumbruchformat variieren.
Zählt wc -w Wörter in jeder Sprache genau?
wc -w zählt Zeichenfolgen, die durch Leerzeichen getrennt sind; es erfolgt keine sprachbewusste Wortsegmentierung. Behandeln Sie das Ergebnis als nach Leerzeichen getrennte Zählung und nicht als linguistische Wortanzahl.
Kann ich die Anzahl der Zeilen in einem Verzeichnis selbst zählen?
wc ist kein Befehl, um Verzeichniseinträge direkt zu zählen. Sie müssen die Liste der Dateien, die Sie möchten, mit Befehlen wie find erstellen und dann die Ergebnisse zusammenfassen. Wenn in Dateinamen Sonderzeichen vorkommen könnten, verwenden Sie NUL-Zeichen als Trenner anstelle von Zeilenumbrüchen.
Zusammenfassung
Die Anzahl der Zeilen kann mit wc -l überprüft werden, die Anzahl der Wörter mit wc -w, die Anzahl der Bytes mit wc -c und die Anzahl der Zeichen mit wc -m. Die Ausgabe ohne Optionen zeigt in der Reihenfolge Zeilen, Wörter und Bytes an, und wenn mehrere Dateien angegeben sind, werden die Werte für jede Datei und die Gesamtsumme angezeigt.
Für genaue Ergebnisse denken Sie daran, dass wc -l Zeilenumbruchszeichen zählt, Bytes und Zeichen unterschiedlich sein können und ein NUL-Trennzeichen für die Liste der Dateinamen erforderlich sein kann. Um sich andere grundlegende Werkzeuge zusammen anzusehen, können Sie eine Liste der häufig verwendeten Befehle in Linux konsultieren.




