grep -v

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

ich bin grad am Nachvollziehen eines Shell-Skriptes. Dabei bin ich auf folgende Zeile gestoßen:
grep -v '^$'

Hab gegoogelt und in die man-Seite reingeschaut. Die Funktion an sich verstehe ich, aber ich kann mir nicht vorstellen, dass das Kommando wirklich die Zeilen ausspuckt, die ^$ nicht enthalten. Vielen Dank im Voraus.

Schöne Grüße aus Rheinland,
Eure Ratna
 

CPoly

Mitglied Weizenbier
Dadurch werden alle leeren Zeilen ignoriert. Das ist ein regulärer Ausdruck.

^ = Beginn einer Zeile
$ = Ende einer Zeile

und dazwischen eben nichts.
 

oraclin25

Erfahrenes Mitglied
Hallo CPoly,

vielen Dank für die rasche Antwort. Wenn ich also folgende Dateien im Ordner "MeinOrdner" hätte:

MeinOrdner -> datei1.txt
MeinOrdner -> datei2.txt

und durch ein Pipe die Zeilen ein grep mache:
ls Ordner | grep -v '^$'

dann werden alle Files ausgegeben. Danke. Persönlich finde ich die Vorgehensweise relativ unnötig kompliziert, nur um alle Zeilen bzw. alle Dateien auszugeben. Aber es steckt sicherlich tieferer Sinn dahinter? Würde Dir da auf Anhieb was einfallen, was der Sinn sein könnte? Ich meine, wenn ich nur die vorhandenen Dateien ausgeben möchte, könnte ich mir ja das grep-Kommando sparen oder?

Schöne Grüße aus Rheinland,
Eure Ratna
 

CPoly

Mitglied Weizenbier
Ich tippe folgendes (mehr geraten):

Code:
$ ls MeinOrdner
datei1.txt  datei2.txt

Also alles in einer Zeile, wohingegen

Code:
$ ls MeinOrdner | grep -v '^$'
datei1.txt
datei2.txt

zeilenweise ist.

Es gibt dort keine leeren Zeilen, die man Filtern will. Viel mehr wird grep missbraucht, um die Darstellung zu ändern.

Edit: Nein, das macht auch keine Sinn. ls gibt die Dinger auch Zeilenweise aus.
 

deepthroat

Erfahrenes Mitglied
Es gibt dort keine leeren Zeilen, die man Filtern will. Viel mehr wird grep missbraucht, um die Darstellung zu ändern.

Edit: Nein, das macht auch keine Sinn. ls gibt die Dinger auch Zeilenweise aus.
Die Ausgabe von ls ändert sich, je nachdem ob stdout ein Terminal ist oder nicht.

Das Gleiche könnte man einfach über "ls -1" erreichen. Allerdings weiß ich nicht ob diese Option nicht evtl. eine GNU Erweiterung ist und nicht von POSIX abgedeckt wird.

Gruß
 

oraclin25

Erfahrenes Mitglied
ich hab eigentlich nicht die vollständige Code-Zeile verraten(einfachheitshalber). Aber ich glaube, ich sollte das tun, weil dadurch vielleicht der Sinn des Ganzen erleuchtender ist:

ls -d1 /Ordner/Ordner/[pattern].txt 2> /dev/null | grep -v '^$'

Also, ich muss ganz ehrlich sagen, ich verstehe nicht, was die Option -d und -1 macht?
 

oraclin25

Erfahrenes Mitglied
Hallo deepthroat,

hab ich eigentlich, leider bin ich nicht wirklich schlau geworden, da mir das Englische nicht so mächtig ist:

-d, list directory entries instead of contents, and do not dereference symbolic links

Also, -d listet den Inhalt des Ordners anstatt dessen Inhalt? Mhh.. peinlich, ich kapiere es einfach nicht.
 

deepthroat

Erfahrenes Mitglied
Hallo deepthroat,

hab ich eigentlich, leider bin ich nicht wirklich schlau geworden, da mir das Englische nicht so mächtig ist:
Warum installierst du dir nicht die deutschen Handbücher? Oder liest das Handbuch online auf deutsch? => z.B. http://manpages.ubuntu.com/manpages/oneiric/de/man1/ls.1.html
Also, -d listet den Inhalt des Ordners anstatt dessen Inhalt?
Ja, warum probierst du es denn nicht aus? Dann siehst du doch den Unterschied...
 

oraclin25

Erfahrenes Mitglied
Das Problem ist, ich kann nicht ausprobieren, da der Unix-Rechner in der Schule ist.

danke für den Tipp, jetzt bin ich schon mal weitergekommen:
es werden also Verzeichniseinträge aufgelistet. Bei einem Ordner mit 2 Dateien:
datei_001.txt
datei_002.txt
würde also nach dem Befehl:
ls -d1 /Ordner/Ordner/[pattern].txt
also nichts rauskommen.

Danach kommt die Teilzeile:
2> /dev/null

Was würde hier ins "schwarze Loch" geworfen? Ich vermute mal, nichts oder? Da es ja keine Fehlermeldung gibt.
Dies ist meine letzte Frage. Bitte helft mir.

Also, die Ausgabe von:
ls -d1 /Ordner/Ordner/[pattern].txt 2> /dev/null

ist erstmal nichts(mit der Annahme dass in dem Ordner kein Ordner existiert). Die Frage ist nun, dieses NICHTS dient desweiteren als Input für das Programm grep?


ls -d1 /Ordner/Ordner/[pattern].txt 2> /dev/null | grep -v '^$'

Schöne Grüße aus Rheinland,
Eure Ratna