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.
command-line
bash
grep
Thorsen
quelle
quelle
Antworten:
Der eckige Klammerausdruck ist Teil der Zeichenklassen-Musterübereinstimmung von grep in der
Bash-Shell (und auch in anderen Shells).Das
grep
Programm versteht standardmäßig grundlegende reguläre POSIX-Ausdrücke. Damit können Sie Zeichenklassen definieren. Zum Beispielps -ef | grep [ab9]irefox
würde " a irefox", " b irefox", " 9 irefox" finden, wenn diese existieren, aber nicht " ab irefox".Der Befehl findet
grep [a-zA-Z0-9]irefox
sogar alle Prozesse, die mit genau einem Buchstaben oder einer Ziffer beginnen und mit "irefox" enden.Also
ps -ef | grep firefox
sucht nach Zeilen mitfirefox
drin. Da der Grep-Prozess selbst "Firefox" enthält, findet Grep das auch. Durch Hinzufügen von a[]
wird nur die Zeichenklasse "[f]" gesucht (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. Daher wird grep selbst nicht im grep-Ergebnis angezeigt.Da nicht sehr viele Leute mit eckigen Klammern als Zeichenklassenvergleich und regulären Ausdrücken im Allgemeinen vertraut sind, könnte das zweite Ergebnis etwas mysteriös aussehen.
Wenn Sie das zweite Ergebnis korrigieren möchten, können Sie diese folgendermaßen verwenden:
(Referenz)
quelle
[f]
ist die Klammer für den Mustervergleich mit regulären Ausdrücken für Zeichenklassen. Wie in "[a-z0-9] irefox" würde grep auch mit "airefox" und "0irefox" übereinstimmen. Sie können leicht erkennen, dass es sich nicht um eine integrierte Bash handelt, daecho $([f])
ein Fehler zurückgegeben wird.[f]irefox
dafür ist, dass es nicht von der Shell erweitert wird. Wenn die Schale expandiert[f]irefox
zufirefox
, dass Ursachengrep
zu sehenfirefox
, und dannfirefox
Teil istgrep
‚s Befehlsfolge, genau als obgrep firefox
wurden durchgeführt. Es empfiehlt sich jedoch, den Shell-Pattern-Abgleich im Auge zu behalten , insbesondere bei der Skripterstellung. Wennfirefox
im aktuellen Verzeichnis eine Datei aufgerufen wird , wird die Shell auf erweitert[f]irefox
,firefox
und diese Methode schlägt fehl, dh diegrep
Zeile vonps
wird angezeigt.Der Grund ist, dass die Zeichenfolge
stimmt mit dem Muster überein
firefox
, aber mit der Zeichenfolgestimmt nicht mit dem Muster überein
[f]irefox
(was dem Muster entsprichtfirefox
).Das ist der Grund, warum das erste grep mit seiner eigenen Prozessbefehlszeile übereinstimmt, das zweite grep nicht.
quelle