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 -c
als auch -v
"globale" Optionen sind. Sie ändern das Verhalten der gesamten grep
Operation, wenn sie in der Befehlszeile angegeben werden. Es ist nicht sinnvoll, -c
oder -v
mehrfach 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 grep
klar 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 grep
wird die Befehlszeile so neu anordnen, dass Optionen vor Pfadnamenoperanden stehen (sofern dies nicht POSIXLY_CORRECT
in der Umgebung festgelegt ist), aber im Allgemeinen möchten Sie portablen Shellcode schreiben, der mit jeder grep
Implementierung 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 grep
Implementierungen ebenfalls ausgeschlossen. Sie können LC_ALL=C grep
dies 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.