Zeilen in der Datei zählen, ohne leere Zeilen zu zählen

Zeilen in der Datei zählen, ohne leere Zeilen zu zählen

Nehmen wir an, es gibt eine Datei mit 7 Zeilen. Beispiel:

a
b
c
#

d
e

Beim Ausführen grep -c '#' -c -v filenamehere werden mir 6 Zeilen angezeigt.

Ich möchte, dass 5 Zeilen angezeigt werden, um den Leerraum zu entfernen.

Antwort1

Ihre Datei hatSiebenZeilen darin, aber Sie möchten Zeilen zählen, die nicht leer sind und nicht mit beginnen #.

$ grep -c '^[^#]' file
5

Hiermit wird die Anzahl der Zeilen gezählt, die am Anfang ein Zeichen enthalten, das kein #Zeichen ist.

Der Ausdruck [^#]entspricht einem einzelnen Zeichen, das nicht ist #. Der vollständige Ausdruck ^[^#]entspricht einem Zeichen, das nicht - ist, #am Anfang einer Zeile.

Leere Zeilen entsprechen nicht diesem Ausdruck, ebenso wenig wie Zeilen, die mit #¹ beginnen.

Wenn Sie nur nicht leere Zeilen zählen möchten:

$ grep -c '.' file
6

Dabei werden Zeilen gezählt, die mindestens ein Zeichen enthalten.


Der Vollständigkeit halber zum Zählen leerer Zeilen:

$ grep -c -v '.' file
1

So zählen Sie Zeilen, die leer sind oder mit folgendem beginnen #:

$ grep -c -v '^[^#]' file
2

Beachten Sie, dass sowohl -cals auch -v"globale" Optionen sind. Sie ändern das Verhalten der gesamten grepOperation, wenn sie in der Befehlszeile angegeben werden. Es ist nicht sinnvoll, -coder -vmehrfach anzugeben, und sie akzeptieren keine Optionsargumente.

Beachten Sie auch, dass Sie, wenn Sie das Muster oder den regulären Ausdruck an einer anderen Stelle als als erstes Argument nach allen Optionen angeben, verwenden, -e 'pattern'damit grepklar ist, dass dies das Muster ist, mit dem Sie suchen. Verwenden Sie also entweder

grep -e '.' -c -v file

oder

grep -c -e '.' -v file

oder

grep -c -v '.' file

GNU grepwird die Befehlszeile so neu anordnen, dass Optionen vor Pfadnamenoperanden stehen (sofern dies nicht POSIXLY_CORRECTin der Umgebung festgelegt ist), aber im Allgemeinen möchten Sie portablen Shellcode schreiben, der mit jeder grepImplementierung funktioniert.


¹ Zeilen, die mit einem Nicht-Zeichen beginnen (eine Bytefolge, die zufällig kein gültiges Zeichen in der lokalen Zeichentabelle des Benutzers bildet), werden in den meisten grepImplementierungen ebenfalls ausgeschlossen. Sie können LC_ALL=C grepdies umgehen, indem Sie verwenden. Dies sollte zulässig sein, da #es Teil des portablen Zeichensatzes ist und daher in allen lokalen Tabellen eines bestimmten Systems gleich sein sollte.

verwandte Informationen