ubuntuusers.de

grep/awk in Shell-Skript mit Parametern/Variablen verwenden

Status: Gelöst | Ubuntu-Version: Ubuntu 18.10 (Cosmic Cuttlefish)
Antworten |

althoffc

Anmeldungsdatum:
7. Dezember 2015

Beiträge: 12

Hallo,

ich möchte über ein Shell-Skript die Prozessnummer eines bestimmten laufenden Programmes ermitteln. Dazu verwende ich ein Suchpattern, welches eindeutig für den gesuchten Prozess ist. Ich verwende hierzu bisher folgende Skript-Zeile mit den Suchmustern abc (grep) und /def/ (awk).

1
prozess=`ps -ef | grep abc | awk '/def/ {print "Prozess: " $1 " " $2 " " $9} '`

Mir ist es aber noch nicht gelungen, die Suchmuster abc bzw. /def/ über Parameter oder Variablen dynamisch zu verwenden. Entweder scheiterte es an der Syntax, die Variablenwerte wurde nicht erkannt und die Suchergebnisse waren nicht die erwarteten.

Ich habe folgende versucht:

1
2
filter=abc
prozess=`ps -ef | grep $filter | awk '/def/ {print "Prozess: " $1 " " $2 " " $9} '`

Jedoch führte das nicht zu den gewünschten Ergebnissen.

Gibt es Ideen, wie ich ein Suchmuster/Filter in obiger Zeile z.B. für grep verwenden kann?

Danke und Gruß althoffc

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

althoffc schrieb:

ich möchte über ein Shell-Skript die Prozessnummer eines bestimmten laufenden Programmes ermitteln.

Da bietet sich pgrep an.

Dazu verwende ich ein Suchpattern, welches eindeutig für den gesuchten Prozess ist. Ich verwende hierzu bisher folgende Skript-Zeile mit den Suchmustern abc (grep) und /def/ (awk).

1
prozess=`ps -ef | grep abc | awk '/def/ {print "Prozess: " $1 " " $2 " " $9} '`

Das kann man mindestens vereinfachen zu

1
prozess=`ps -ef | awk '/abc/ && /def/ {print "Prozess: " $1 " " $2 " " $9} '`

Mir ist es aber noch nicht gelungen, die Suchmuster abc bzw. /def/ über Parameter oder Variablen dynamisch zu verwenden. Entweder scheiterte es an der Syntax, die Variablenwerte wurde nicht erkannt und die Suchergebnisse waren nicht die erwarteten.

Ich habe folgende versucht:

1
2
filter=abc
prozess=`ps -ef | grep $filter | awk '/def/ {print "Prozess: " $1 " " $2 " " $9} '`

Jedoch führte das nicht zu den gewünschten Ergebnissen.

Dann wäre prima, wenn Du die Ergebnisse und Deine Erwartungen zeigst. Diese Variante liefert nämlich genau das gleiche wie Deine erste Variante. Du hast ja nur $filter eingeführt und die Zeichenkette "abc" enthält keine Shell-Meta-Zeichen, die man escapen müsste.

Weitere Anmerkungen:

  • Ich würde die auszugebenden Spalten von ps explizit wählen, damit ich sicher bin, was ich bekomme. Dann kann man auch gezielt awk gegen einzelne Felder matchen lassen.

  • Man kann auch die Kopfzeile von ps ausblenden, falls es da zu falschen Treffern kommt.

  • $9 wird nur manchmal gefüllt sein, nämlich wenn ein Prozess entsprechend viele Parameter hat. Ist es das, was Du willst?

  • Möglicherweise bietet sich ein zweistufiger Ansatz an: man nutzt eine Ausgabe von ps mit speziellen Spalten, match in awk und lässt es die PIDs der gefundenen Prozesse ausgeben, was wiederum über xargs -r ps -o cpu,pid,... genutzt wird, um Infos über die Prozesse auszugeben.

Gibt es Ideen, wie ich ein Suchmuster/Filter in obiger Zeile z.B. für grep verwenden kann?

Die Lösung mit awk findest Du hier.

Was ist denn die Aufgabe Deines Skriptes, also, gegen welche Felder willst Du matchen und was willst Du ausgeben?

althoffc

(Themenstarter)

Anmeldungsdatum:
7. Dezember 2015

Beiträge: 12

Hallo rklm,

ich werde Deinen Hinweisen mal nachgehen und es nochmals probieren und geben dann wieder Bescheid.

Ergänzung: Ich habe in meinem Beispiel vereinfacht die Muster abc und /def/ angegeben. Tatsächlich habe ich aber mit regulären Ausdrücken suchen wollen. Ich muss mit awk dann $0 ~ pattern verwenden, damit die regulären Ausdrücke korrekt ausgewertet werden.

Habe mein Problem somit gelöst. Danke für die Hinweise.

Gruß althoffc

Antworten |