Archiv verlassen und diese Seite im Standarddesign anzeigen : Suchen mit grep
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 :-(
Du solltest in der RegEx auch noch angeben, das zwischen Anfang und Ende beliebig viele Zeichen stehen dürfen...
ps aux | egrep '3923|progname'
Greeez Oli
... macht nicht das, was er will.
er will ein "und mit Bedingung", kein Oder...
Also so ?
ps aux | grep ^3923 $progname
Greeez Oli
Nein.
Testest Du die Ausdrücke eigentlich bevor Du sie postest oder rätst Du nur?
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
und warum nun noch den Part hinter dem Pipezeichen? Abgesehen davon, dass er keinen Sinn macht und sozusagen syntaktisch falsch ist?
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
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>
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.
http://www.tldp.org/LDP/abs/html/
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.
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?
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'
Ja, das funktioniert super.
Vielen Dank!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.