PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suchen mit grep



kerse
22.01.08, 07:38
Ich würde gerne mit grep meine laufenden Prozesse durchsuchen, und zwar so, dass etwas bestimmtes am Zeilenanfang (userid) UND etwas bestimmtes am Zeilenende (prozessname) steht.
Also zum Beispiel:


ps aux | grep '^3923 ./progname$'

aber so klappt es nicht :-(

marce
22.01.08, 07:47
Du solltest in der RegEx auch noch angeben, das zwischen Anfang und Ende beliebig viele Zeichen stehen dürfen...

zyrusthc
22.01.08, 07:52
ps aux | egrep '3923|progname'

Greeez Oli

marce
22.01.08, 07:56
... macht nicht das, was er will.

er will ein "und mit Bedingung", kein Oder...

zyrusthc
22.01.08, 08:10
Also so ?

ps aux | grep ^3923 $progname

Greeez Oli

marce
22.01.08, 08:16
Nein.

Testest Du die Ausdrücke eigentlich bevor Du sie postest oder rätst Du nur?

zyrusthc
22.01.08, 08:31
Nein.

Testest Du die Ausdrücke eigentlich bevor Du sie postest oder rätst Du nur?
Cool bleiben!


ps aux | grep -E '^3923.*progname$|progname$.^*3923'

Greeez Oli

marce
22.01.08, 08:38
und warum nun noch den Part hinter dem Pipezeichen? Abgesehen davon, dass er keinen Sinn macht und sozusagen syntaktisch falsch ist?

zyrusthc
22.01.08, 08:46
und warum nun noch den Part hinter dem Pipezeichen? Abgesehen davon, dass er keinen Sinn macht und sozusagen syntaktisch falsch ist?
Ok, na dann...
Wo bleibt eigentlich dein perfektes Beispiel? :rolleyes:


Greeez Oli

marce
22.01.08, 08:53
Von "perfektem Beispiel" habe ich nie was geschriebem - ich habe lediglich dem TE einen Tip gegeben, ich welche Richtung er seine RegEx abändern muss - sollte er damit Probleme haben wäre ich gerne bereit, weitere Hinweise zu geben. Hilfe zur Selbsthilfe - weil einfach eine RegEx hinknallen und kommentarlos stehen lassen ist auch nicht ideal - er soll ja schliesslich erkennen, was bei ihm nicht gestimmt hat (oder eben durch einen Hinweis selbst darauf kommen. Ist pädagogisch sinnvoller(*))

Aber wenn Du willst:
bei mir funktioniert problemlos
ps aux | grep '^foo.*bar$' (und das schon seit 7:46, ansonsten hätte ich nicht gepostet)


(*) <Sarkasmus>vor allem, wenn die geposteten "Lösungen" keine sind :-)</Sarkasmus>

kerse
22.01.08, 09:56
Danke euch, ich wusste nicht, dass man .* stellvertretend für beliebig viele Zwischenzeichen verwenden muss.

Jetzt hätte ich gleich noch ne Frage: Kann ich das Ergebnis weiterpipen und es mit einem Vergleich auswerten? Also, sollte ein solcher Prozess laufen, dann soll es mir z.B. "passt" zurückliefern:


ps aux | grep '^foo.*bar$' | [ -ne "" ] && echo 'passt'

funktioniert leider nicht.

marce
22.01.08, 09:57
http://www.tldp.org/LDP/abs/html/

buzz768
22.01.08, 10:14
grep gibt true zurück, wenn etwas gefunden wurde, den Vergleich mit einem leeren String brauchst du also nicht. Die normale Ausgabe von grep lässt sich mit -q unterdrücken.

kerse
22.01.08, 11:22
OK, danke,


ps aux | grep -q '^5025.*prog$' | [ -n "true" ] && echo 'eins' || echo 'zwei'

funktioniert.

Allerdings, wir IMMER 'zwei' zurückgegeben, wenn ich es mit


sh -c ps aux | grep -q '^5025.*prog$' | [ -n "true" ] && echo 'eins' || echo 'zwei'

ausführe! Warum das?

buzz768
22.01.08, 12:41
Also das erste geht schon mal nicht, weil [ -n "$string" ] true ergibt, wenn $string (in diesem Falle "true") mehr als 0 Zeichen hat, es kommt also immer "eins" heraus. So geht's viel einfacher


ps aux | grep -q '^5025.*prog$' && echo 'eins' || echo 'zwei'

kerse
22.01.08, 14:04
Ja, das funktioniert super.
Vielen Dank!