Ich brauche Hilfe beim Erstellen eines regulären Ausdrucks für ein Grep, um nur den Pfad zu laufenden Java-Versionen anzuzeigen

Ich brauche Hilfe beim Erstellen eines regulären Ausdrucks für ein Grep, um nur den Pfad zu laufenden Java-Versionen anzuzeigen

Ich brauche Hilfe beim Erstellen eines grep aus ps -ef, um nur Java-Pfade zurückzugeben.

Angenommen, wir haben den folgenden laufenden Prozess:

bash> ps -ef | grep java
user  pid#      1  1 00:00 ?        00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc.

Was ich damit sagen wollte, ist:

bash> ps -ef | grep 'some regex or pattern here'
/path/to/java/jdk_1.8/bin/java

Danke an alle.

Antwort1

Wie wäre es mit: grep -oP "/.*?/bin/java"Das wird ab dem ersten gefundenen Schrägstrich durchgehen und dann versuchen, bis zum ersten Vorkommen von /bin/java zu passen. Das große P erhält gute Regex-Unterstützung von grep

oder dies und benötigt nicht einmal -P mit grep. grep -oP "/.*/bin/java"Beginnt mit dem ersten Schrägstrich und gleicht dann so viele Zeichen wie möglich bis einschließlich /bin/java ab.

Und wenn Sie es selbst von Grund auf neu erarbeiten müssten, können Sie neben dem Wissen über reguläre Ausdrücke die Dinge schnell mit echo eg testen echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grepund dann Muster ausprobieren. Und Sie können dem grep egor ein -i hinzufügen, gemischt mit -o so -io, um es nicht mehr zwischen Groß- und Kleinschreibung unterscheiden zu lassen (was -i tut).

Hinweis: Das Obige ist in Ordnung, aber ich möchte anmerken, dass es, falls Sie an regulären Ausdrücken oder technischen Details interessiert sind, .*blahetwas interessant ist, da .*(gierige Auswertung) ein bla enthalten kann. Wenn Sie also bla 5 Mal haben, würde es 5 Mal mit bla übereinstimmen. 4 von .*und das letzte von bla. Es gibt .*?blah(träge Auswertung), die mit jedem Zeichen bis zum ersten bla übereinstimmt. Dafür ist allerdings -P erforderlich. Aber in Ihrem Fall, wenn Sie nach /bin/java suchen, werden Sie /bin/java nicht mehrmals in einer Zeile erhalten. Es ist also keine große Sache/kein Problem, das .*ohne das ? zu verwenden.

Antwort2

Es scheint mir ein bisschen blöd, pseine Menge Informationen auszudrucken, die man nicht haben will, und dann einen komplexen grepAusdruck verwenden zu müssen, um das zu extrahieren, was manTunwollen. Der folgende Ansatz scheint besser zu sein:

ps -C java -o cmd=

Dadurch erhalten Sie die Argumentliste aus dem Befehl, Sie können sie jedoch mit dem folgenden sedFilter auf das Argument 0 beschränken:

ps -C java -o cmd= | sed 's%\(/java\) .*$%\1%'

Wenn der Pfad keine Leerzeichen enthält, was mit ziemlicher Sicherheit der Fall ist java, kann ein viel einfacherer Filter verwendet werden:

ps -C java -o cmd= | sed 's/ .*$//'

(Tatsächlich $kann es weggelassen werden, da die „gierige“ Übereinstimmung alle Zeichen bis zum Zeilenende umfasst, obwohl es aus Gründen der Lesbarkeit normalerweise besser ist, es mit einzuschließen.)

verwandte Informationen