Ich brauche Hilfe beim Erstellen eines Regex für einen Grep, der nur den Pfad zum Ausführen von Java-Versionen anzeigt

443
Barry

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

Nehmen wir an, wir haben den folgenden Ablauf:

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 von diesem war, ist anzuzeigen:

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

Danke euch allen.

-3
Abgesehen von den Zitaten, was ist mit Ihrem Befehl falsch? AFH vor 7 Jahren 0
Hi AFH Ich sehe das extra Zitat danke. Das Problem ist nicht die Schleife selbst, vielleicht waren das zu viele Informationen. Ich möchte nur die laufende Version von Java anzeigen. Ich suche nach einer Art von grep: grep -o '/ * java', das nur den Befehl java ohne Parameter oder andere Attribute von ps anzeigt Barry vor 7 Jahren 0
Im Grunde möchten Sie eine gute Regex barlop vor 7 Jahren 0
Ja, das ist alles, wonach ich suche. Ich habe einen schlechten Titel für die Frage ausgewählt. Ich habe den Titel korrigiert und meine Ausgabe vereinfacht. Barry vor 7 Jahren 0
wie wäre es mit `grep -oP" /.*?/ bin / java "` Das geht vom ersten gefundenen Forwardlash weiter, dann versuchen Sie es bis zum ersten Auftreten von / bin / java. Die Hauptstadt P wird von Grep gut unterstützt barlop vor 7 Jahren 0
oder das und der -P braucht gar nicht mit grep. `grep -oP" /.*/ bin / java "` Beginnt mit dem ersten Vorwärtsschlag und stimmt dann so gut wie möglich mit jedem Zeichen bis einschließlich bin / java überein. barlop vor 7 Jahren 0
Perfekt, ich kann von hier aus mit beiden zusammenarbeiten! Vielen Dank. Barry vor 7 Jahren 0
yeah und wenn du es von Grund auf selbst ausarbeiten musstest, dann kannst du nicht nur etwas über Regex wissen, sondern kannst es auch schnell mit echo testen, zB `echo user pid # 1 1 00:00? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo = bar -foo2 = bar2 ... usw. | grep `dann probier Muster. Und Sie können ein -i zum grep egor hinzufügen, das mit -o so -io gemischt wird, um die Groß- und Kleinschreibung zu berücksichtigen (was -i tut). barlop vor 7 Jahren 0

2 Antworten auf die Frage

0
AFH

Es scheint ein bisschen zu mir bescheuert zu bekommen psviele Informationen drucken Sie nicht wollen, dann einen Komplex verwenden, um grepAusdruck zu extrahieren, was Sie tun wollen. Folgendes scheint ein besserer Ansatz zu sein:

ps -C java -o cmd= 

Dadurch erhalten Sie die Argumentliste aus dem Befehl. Sie können sie jedoch mit dem sedFilter auf Argument 0 reduzieren:

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

Wenn, wie fast sicher, keine Leerzeichen im javaPfad vorhanden sind, kann ein wesentlich einfacherer Filter verwendet werden:

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

(Tatsächlich $kann das weggelassen werden, da die "gierige" Übereinstimmung alle Zeichen bis zum Zeilenende einschließt, obwohl es in der Regel auch aus Gründen der Lesbarkeit enthalten ist.)

-1
barlop

Wie grep -oP "/.*?/bin/java"wär's mit? Das geht vom ersten Vorwärtsschlag aus, den es findet, und versuchen Sie, bis zum ersten Auftreten von / bin / java zuzuordnen. Die Hauptstadt P wird von grep gut unterstützt

oder das und der -P braucht gar nicht mit grep. grep -oP "/.*/bin/java"Beginnt mit dem ersten Schrägstrich und stimmt dann so gut wie möglich mit jedem Zeichen bis einschließlich bin / java überein.

Und wenn Sie sich von Grund auf selbst ausarbeiten mussten, dann können Sie neben dem Wissen über Regex auch Dinge schnell mit Echo testen, z echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grep. B. Muster ausprobieren. Und Sie können ein -i zum grep egor hinzufügen, das mit -o so -io gemischt wird, um die Groß- / Kleinschreibung nicht zu berücksichtigen (was -i tut).

Anmerkung - das obige ist in Ordnung, aber ich würde nur bemerken, dass, wenn Sie sich für Regex oder technische Aspekte interessieren - .*blahein bisschen interessant ist, weil die .*(gierige Bewertung) ein blah enthalten kann. Wenn Sie also 5 mal blah haben, würde es passen bla 5 mal. 4 von .*und der letzte von bla. Es gibt .*?blah(faule Bewertung), die mit jedem Charakter bis zum ersten Schlag übereinstimmen würde. obwohl das -P erfordert. Aber wenn Sie nach / bin / java suchen, werden Sie / bin / java nicht mehrmals in einer Zeile erhalten, es ist also kein großes Problem / Problem, das .*ohne? Zu verwenden.