it-swarm.com.de

Wie funktioniert dieser klapprige Klammerausdruck in grep?

Ich habe diesen Einzeiler kürzlich gesehen:

$ ps -ef | grep [f]irefox 

thorsen   16730     1  1 Jun19 ?        00:27:27 /usr/lib/firefox/firefox ...

Es scheint also die Liste der Prozesse mit "firefox" in den Daten zurückzugeben, aber den grep-Prozess selbst wegzulassen, und entspricht daher in etwa:

ps -ef |grep -v grep| grep firefox

Ich kann jedoch nicht verstehen, wie es funktioniert. Ich habe die Manpage auf grep und anderswo durchgesehen, aber keine Erklärung gefunden.

Und um das Rätsel zu verschärfen, wenn ich laufe:

$ ps -ef | grep firefox  > data
$ grep [f]irefox data

thorsen   15820 28618  0 07:28 pts/1    00:00:00 grep --color=auto firefox
thorsen   16730     1  1 Jun19 ?        00:27:45 /usr/lib/firefox/firefox ....

der [t] rick scheint nicht mehr zu funktionieren!

Jemand hier wird wissen, was los ist, da bin ich mir sicher.

Vielen Dank.

38
Thorsen

Der Ausdruck in eckigen Klammern ist Teil von bash Shell (und auch andere Shells) greps Character Class Pattern Matching.

Das Programm grep versteht standardmäßig grundlegende reguläre POSIX-Ausdrücke. Damit können Sie Zeichenklassen definieren. Zum Beispiel würde ps -ef | grep [ab9]irefox "einirefox ","birefox ","9irefox "wenn diese existieren, aber nicht"abirefox ".

Der Befehl grep [a-zA-Z0-9]irefox würde sogar alle Prozesse finden, die mit genau einem Buchstaben oder einer Zahl beginnen und mit "irefox" enden.

Also sucht ps -ef | grep firefox nach Zeilen mit firefox darin. Da der Grep-Prozess selbst "Firefox" enthält, findet Grep das auch. Durch Hinzufügen eines [] suchen wir nur nach der Zeichenklasse "[f]" (die nur aus dem Buchstaben "f" besteht und daher nur einem "f" ohne eckige Klammern entspricht). Der Vorteil der Klammern ist nun, dass der String "firefox" im grep-Befehl nicht mehr erscheint. Grep selbst wird daher nicht im grep-Ergebnis angezeigt.

Da nicht sehr viele Menschen mit eckigen Klammern als Zeichenklassenvergleich und regulären Ausdrücken im Allgemeinen vertraut sind, sieht das zweite Ergebnis möglicherweise etwas mysteriös aus.

Wenn Sie das zweite Ergebnis korrigieren möchten, können Sie diese folgendermaßen verwenden:

ps -ef | grep [f]irefox  > data
grep firefox data

(Referenz)

56
jokerdino

Der Grund ist, dass die Zeichenfolge

grep firefox

entspricht dem Muster firefox, aber der Zeichenfolge

grep [f]irefox

stimmt nicht mit dem Muster [f]irefox überein (das dem Muster firefox entspricht).

Das ist der Grund, warum das erste grep mit seiner eigenen Prozessbefehlszeile übereinstimmt, während das zweite grep dies nicht tut.

10