Wie zähle ich Zeilen in einem Dokument?


1077

Ich habe solche Zeilen und möchte wissen, wie viele Zeilen ich tatsächlich habe ...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

Gibt es eine Möglichkeit, sie alle mit Linux-Befehlen zu zählen?


4
Öffnen Sie die Datei mit vim und geben g <Ctrl-g>Sie sie ein. Sie zeigt die Anzahl der Zeilen, Wörter, Spalten und Bytes an
Luv33preet

31
@ Luv33preet dann finden Sie sich einfach wieder auf SO und schauen nach, wie man vim beendet
Skylar Ittner

5
@SkylarIttner Und wenn Sie nachschlagen müssen, wie Sie vim beenden können, <esc> :q!ist dies die einzige Antwort. (Dies ist ein Witz. Dadurch werden alle nicht gespeicherten Änderungen gelöscht. Wenn Sie vim nicht kennen, ist es einfach, eine Datei durcheinander zu bringen. Speichern Sie sie daher besser nicht.)
Ryan

Antworten:


2030

Verwendung wc:

wc -l <filename>

Dies gibt die Anzahl der Zeilen aus in <filename>:

$ wc -l /dir/file.txt
3272485 /dir/file.txt

Oder, um das <filename>aus dem Ergebnis wegzulassen, verwenden Sie wc -l < <filename>:

$ wc -l < /dir/file.txt
3272485

Sie können auch Daten an folgende wcAdresse weiterleiten:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
das ist toll!! Sie können awk verwenden, um den Dateinamen zu wc -l <file> | awk '{print $1}
entfernen

80
Noch kürzer könnte man machenwc -l < <filename>
Tensigh

5
@ GGB667 Sie können auch den Dateinamen mitcat <file> | wc -l
Taufe

14
und mit können watch wc -l <filename>Sie diese Datei in Echtzeit verfolgen. Dies ist beispielsweise für Protokolldateien nützlich.
DarkSide

27
Beachten Sie, dass wc -l "Zeilenumbrüche" zählt. Wenn Sie eine Datei mit 2 Textzeilen und einem "Zeilenumbruch" -Symbol dazwischen haben, gibt wc "1" anstelle von "2" aus.
Konstantin

140

Um alle Zeilen zu zählen, verwenden Sie:

$ wc -l file

Um nur Zeilen mit Muster zu filtern und zu zählen, verwenden Sie:

$ grep -w "pattern" -c file  

Oder verwenden Sie -v, um die Übereinstimmung umzukehren:

$ grep -w "pattern" -c -v file 

Sehen Sie sich die grep-Manpage an, um einen Blick auf die Argumente -e, -i und -x zu werfen ...


Seltsamerweise grep -cfunktioniert das manchmal besser für mich. Hauptsächlich wegen des wc -lnervigen "Feature" -Polsterplatzpräfixes.
MarkHu


43

es gibt viele Wege. Verwenden wcist eins.

wc -l file

andere schließen ein

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
Ja, aber wc -l filegibt Ihnen die Anzahl der Zeilen UND den Dateinamen, um nur den Dateinamen zu erhalten, den Sie tun können:filename.wc -l < /filepath/filename.ext
ggb667

Bei Verwendung des GNU-Arguments grep -H werden Dateiname und Anzahl zurückgegeben. grep -Hc ".*" file
Zlemini

Ich habe diese Lösung gewählt, weil wc -lZeilenumbruchzeichen und nicht die tatsächlichen Zeilen in einer Datei gezählt werden. Alle anderen in dieser Antwort enthaltenen Befehle geben Ihnen die richtige Nummer, falls Sie die Zeilen benötigen.
Growlingchaos

27

Das Tool wcist der "Wortzähler" in UNIX- und UNIX-ähnlichen Betriebssystemen. Sie können es jedoch auch zum Zählen von Zeilen in einer Datei verwenden, indem Sie die -lOption hinzufügen .

wc -l foozählt die Anzahl der Zeilen in foo. Sie können die Ausgabe auch von einem Programm wie diesem ls -l | wc -lweiterleiten: Hier erfahren Sie, wie viele Dateien sich im aktuellen Verzeichnis befinden (plus eine).


3
ls -l | wc -l gibt Ihnen tatsächlich die Anzahl der Dateien im Verzeichnis +1 für die Gesamtgröße der Zeile. Sie können tun ls -ld * | wc -l, um die richtige Anzahl von Dateien zu erhalten.
Joshua Lawrence Austill

24

Wenn Sie die Gesamtzeile aller Dateien in einem Verzeichnis überprüfen möchten, können Sie find und wc verwenden:

find . -type f -exec wc -l {} +


15

Wenn alles, was Sie wollen, die Anzahl der Zeilen ist (und nicht die Anzahl der Zeilen und der dumme Dateiname, der zurückkommt):

wc -l < /filepath/filename.ext

Wie bereits erwähnt, funktionieren diese auch (sind aber aus anderen Gründen minderwertig):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
Diese Antwort wurde 3 Jahre nach der Frage veröffentlicht und kopiert nur andere. Der erste Teil ist das Triviale und der zweite ist alles, was Ghostdogs Antwort hinzufügte. Downvoting.
Fedorqui 'SO hör auf,'

4 Jahre später .. Downvoting. Mal sehen, ob wir eine zehn Jahre lange Abstimmungsserie bekommen können!
Damien Roche

1
Nein, du liegst falsch; Die Antwort von Ghostdog beantwortet nicht die ursprüngliche Frage. Es gibt Ihnen die Anzahl der Zeilen UND den Dateinamen. Um nur den Dateinamen zu erhalten, können Sie Folgendes tun: Dateiname.wc -l </filepath/filename.ext. Deshalb habe ich die Antwort gepostet. awk, sed und grep sind alles etwas minderwertige Methoden, um dies zu tun. Der richtige Weg ist der, den ich aufgelistet habe.
ggb667

8

Verwenden Sie nlwie folgt:

nl filename

Von man nl:

Schreiben Sie jede DATEI in die Standardausgabe, wobei Zeilennummern hinzugefügt werden. Ohne DATEI oder wenn DATEI - ist, lesen Sie die Standardeingabe.


Dies ist die erste Antwort, die ich gefunden habe und die mit einer Datei funktioniert, die eine einzelne Textzeile enthält, die nicht in einer neuen Zeile endet, die wc -lals 0 gemeldet wird . Vielen Dank.
Scott Joudry

7

Ich habe dies verwendet:

cat myfile.txt | wc -l

Ich bevorzuge es gegenüber der akzeptierten Antwort, da der Dateiname nicht gedruckt wird und Sie ihn nicht verwenden müssen, um dies awkzu beheben. Akzeptierte Antwort:

wc -l myfile.txt

Aber ich denke, das Beste ist die Antwort von GGB667:

wc -l < myfile.txt

Ich werde das wahrscheinlich von nun an verwenden. Es ist etwas kürzer als mein Weg. Ich stelle meine alte Art auf, es zu tun, falls es jemand bevorzugt. Die Ausgabe ist bei diesen beiden Methoden dieselbe.


3
Die erste und die letzte Methode sind gleich. Der letzte ist besser, weil er keinen zusätzlichen Prozess erzeugt

5

Oben sind die bevorzugten Methoden aufgeführt, aber der Befehl "cat" kann auch hilfreich sein:

cat -n <filename>

Zeigt Ihnen den gesamten Inhalt der Datei mit Zeilennummern.


5

Ich habe diese Frage gesehen, als ich nach einer Möglichkeit gesucht habe, mehrere Dateizeilen zu zählen. Wenn Sie also mehrere Dateizeilen einer TXT-Datei zählen möchten, können Sie dies tun:

cat *.txt | wc -l

es wird auch auf einer .txt-Datei ausgeführt;)


5

wc -l zählt keine Zeilen.

Ja, diese Antwort mag für die Partei etwas spät sein, aber ich habe noch niemanden gefunden, der eine robustere Lösung in den Antworten dokumentiert.

Entgegen der landläufigen Meinung erfordert POSIX, dass Dateien überhaupt nicht mit einem Zeilenumbruchzeichen enden. Ja, die Definition einer POSIX 3.206-Leitung lautet wie folgt:

Eine Folge von null oder mehr Nicht-<newline> -Zeichen plus einem Abschlusszeichen.

Vielen Menschen ist jedoch nicht bewusst, dass POSIX POSIX 3.195 Incomplete Line auch definiert als:

Eine Folge von einem oder mehreren Nicht-<newline> -Zeichen am Ende der Datei.

Daher sind Dateien ohne Trailing LFperfekt POSIX-kompatibel.

Wenn Sie beide EOF-Typen nicht unterstützen, ist Ihr Programm nicht POSIX-kompatibel.

Schauen wir uns als Beispiel die folgende Datei an.

1 This is the first line.
2 This is the second line.

Unabhängig von der EOF würden Sie sicher zustimmen, dass es zwei Zeilen gibt. Sie haben das herausgefunden, indem Sie sich angesehen haben, wie viele Zeilen gestartet wurden, und nicht, wie viele Zeilen beendet wurden. Mit anderen Worten, gemäß POSIX haben beide Dateien dieselbe Zeilenanzahl:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

In der Manpage wird relativ klar über das wcZählen von Zeilenumbrüchen gesprochen, wobei ein Zeilenumbruch nur ein 0x0aZeichen ist:

NAME
       wc - print newline, word, and byte counts for each file

wcVersuchen Sie daher nicht einmal zu zählen, was Sie als "Linie" bezeichnen könnten. Die Verwendung wczum Zählen von Zeilen kann je nach EOF Ihrer Eingabedatei sehr gut zu Fehlzählungen führen.

POSIX-konforme Lösung

Sie können verwenden grepzählen Linien nur wie oben im Beispiel. Diese Lösung ist sowohl robuster als auch präziser und unterstützt die verschiedenen Varianten einer Zeile in Ihrer Datei:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': Um NUR die Ziffern zurückzugeben .


3

Die Umleitung / Weiterleitung der Ausgabe der Datei an wc -lsollte ausreichen, wie folgt:

cat /etc/fstab | wc -l

was dann die Nr. nur von Zeilen.


3

Oder zählen Sie alle Zeilen in Unterverzeichnissen mit einem Dateinamenmuster (z. B. Protokolldateien mit Zeitstempeln im Dateinamen):

wc -l ./**/*_SuccessLog.csv

2

Ich weiß, das ist alt, aber immer noch: Zähle gefilterte Zeilen

Meine Datei sieht aus wie:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

Wenn ich wissen möchte, wie viele Dateien gesendet werden OK:

grep "OK" <filename> | wc -l

ODER

grep -c "OK" filename

2

Anzahl der Zeilen zählen und Ergebnis in Variable speichern Verwenden Sie diesen Befehl:

count=$(wc -l < file.txt) echo "Number of lines: $count"


1

Wie andere sagten, wc -list dies die beste Lösung, aber für zukünftige Referenzzwecke können Sie Perl verwenden:

perl -lne 'END { print $. }'

$.enthält Zeilennummer und ENDBlock wird am Ende des Skripts ausgeführt.


1
Funktioniert nicht:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW

1
@VeikkoW Funktioniert für mich. Wenn Sie unter Windows arbeiten, gelten andere Angebotsregeln. aber das OP fragte nach Linux / Bash.
Tripleee

1
perl -lne '}{ print $. 'macht das gleiche.
Tom Fenech


1

wc -l <filename>

Dadurch erhalten Sie die Anzahl der Zeilen und den Dateinamen in der Ausgabe.

Z.B.

wc -l 24-11-2019-04-33-01-url_creator.log

Ausgabe

63 24-11-2019-04-33-01-url_creator.log

Verwenden

wc -l <filename>|cut -d\ -f 1

um nur die Anzahl der Zeilen in der Ausgabe zu erhalten.

Z.B.

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

Ausgabe

63


Wo ist der Vorteil der Wiederholung der akzeptierten (zehn Jahre alten) Antwort?
Jeb

Weil ich in diesem Thread keinen Befehl finden konnte, nur Zeilennummern in der Ausgabe abzurufen.
Harsh Sarohi

Es ist das zweite Beispiel in der akzeptierten Antwort. wc -l < filename
Jeb

wc -l <Dateiname> gibt den Dateinamen sowie die Anzahl der ausgegebenen Zeilen an.
Harsh Sarohi

Nein, wc -l < filenameunterscheidet sich von wc -l filename, die erste verwendet die Umleitung und dann gibt es keinen Dateinamen in der Ausgabe, wie in der Antwort von user85509
jeb

1

Diese tragbare Shell-Funktion [ℹ]   wirkt wie ein Zauber. Fügen Sie einfach das folgende Snippet zu Ihrer .bashrcDatei hinzu (oder das Äquivalent für Ihre Shell-Umgebung) .

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

Dies sollte zusätzlich zu bash und zsh mit allen POSIX-kompatiblen Shells vollständig kompatibel sein .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.