Wenn es mit ls geleitet wird, funktioniert grep in solaris nicht

701
sandywho

Ich verwende den folgenden Befehl in Solaris

ls -l | grep '*PROC*' 

Aber es funktioniert nicht. Ich habe viele Dateien, die "PROC" in ihrem Namen enthalten, wie "XREF_PROC.complete", aber wenn ich den obigen Befehl verwende, wird dessen Ausgabe nicht angezeigt. Wenn ich es benutze, ls *PROC*funktioniert es aber nicht mit grep.

Vielen Dank

3

1 Antwort auf die Frage

10
Thor

tl; dr

Sie brauchen keinen Quantifizierer, nur grep für PROC:

ls | grep PROC 

lange Version

Das Sternchen in Ihrer lsZeile stimmt nicht mit dem in Ihrer grepZeile überein .

Wenn Sie ein nicht mit einem Stern versehenes Sternchen in der Befehlszeile haben, wird es von der Shell erweitert, bevor lses angezeigt wird . Dies wird als Globbing bezeichnet . Ein Sternchen allein wird auf alle Dateien im aktuellen Verzeichnis erweitert. Versuchen Sie es beispielsweise echo *. Der *PROC*Glob wird auf alle Dateien erweitert, die PROC enthalten.

Das Sternchen, das Sie verwenden, grep wird mit einfachen Anführungszeichen gekennzeichnet und daher von interpretiert grep. Verwendet jedoch grepstandardmäßig BREs (Basic Regular Expressions), bei denen das Sternchen als Quantifizierer fungiert und daher ein Zeichen oder eine Zeichenklasse zur Quantifizierung erforderlich ist, z '.*'.

Danke für die Hilfe. Ich verwende REDHAT-Unix-Server und wenn ich `ls -l | grep * PROC * `funktioniert gut. Aber nicht in Solaris. Ist dies ein einzigartiger Fall in Solaris oder fehlt mir etwas? sandywho vor 9 Jahren 0
@sandywho: Beachten Sie, dass Sie _nicht_ den Sternchen entgehen. Dies bedeutet, dass die Shell `* PROC *` erweitert, bevor grep dies erkennt. Dieses * nur * funktioniert, wenn nur eine Datei mit PROC im Namen vorhanden ist. Escape-Pattern immer an grep übergeben! Thor vor 9 Jahren 2
Sie wissen das, aber es lohnt sich zu erwähnen, dass Ihre Antwort speziell BREs aufruft., Grep kann auch EREs oder PCREs verwenden, obwohl in der Tat jeder reguläre Ausdruck '. *' wie bei BREs ist. Es ist also kein Thema von BRE / ERE / PCRE, es ist nur die Tatsache, dass es sich um einen regulären Ausdruck handelt. barlop vor 9 Jahren 1
@sandywho Geben Sie "echo *" ein, um zu sehen, ob die Ausgabe in solaris unterschiedlich ist und wie sie sich unterscheidet. `*` wird auf jede Datei im aktuellen Verzeichnis erweitert (nicht genau das, was Sie wollen, aber * tut dies, wenn sie von der * nix-Shell interpretiert wird). Es ist nicht wie in der Windows-Befehlszeile, wo der Befehl immer `*` interpretiert. Versuchen Sie `ls -l | grep '. * PROC. *' '' cos `. *` ist regulärer Ausdruck für eine beliebige Zeichenfolge barlop vor 9 Jahren 1
@ barlop Wenn also ein Befehl wie "echo *" lange genug dauern würde (und kein interner Befehl wäre), könnten Sie ihn in "ps x" finden und dort als "echo file1 file2 file3 file4" erscheinen `anstelle von` echo * ` Hagen von Eitzen vor 9 Jahren 0
@sandywho: Redhat ist kein Unix-zertifiziertes Unix-ähnliches Betriebssystem, Linux rkosegi vor 9 Jahren 0
@HagenvonEitzen ja aber das "vervollständigt" meinen Punkt. da mein Punkt nur darin bestand, dass * sich ausdehnt, war das Echo wirklich nur eine Sicherheitssache. Ich hätte meinen Punkt mehr als das Echo vereinfachen können, aber den Typ nur eingeben * eingeben. `$ *`Aber wenn die erste Datei ein Befehl ist, würde sie es ausführen, also ist das Echo sicherer barlop vor 9 Jahren 0