PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : awk: variable im regulären Ausdruck



musketaquid
06-05-2006, 16:13
Wie ist es Möglich eine Variable in einem regulären Ausdruck zu verwenden?
z.B.
cat datei | awk '/ENVIRON["VAR"]/ {print $0}'
funktioniert nicht, weil ENVIRON["VAR"] nicht übersetzt wird :(
Ich hab auch noch folgendes probiert:

export VAR="/blabla/"; cat datei | awk 'ENVIRON["VAR"] {print $0}'
Geht auch nicht.

Romanday
06-05-2006, 20:18
Wie ist es Möglich eine Variable in einem regulären Ausdruck zu verwenden?


Ja, geht. Mußt du vorher mit -v übergeben.

musketaquid
09-05-2006, 21:17
Ich hab versucht die Variable mit -v zu übergeben, aber ich kann sie immer noch nicht im regulären Ausdruck verwenden, weil die Variable als solche nicht erkannt wird, da sie in Schrägstrichen steht.
Kannst du mir vielleicht ein Beispiel geben?

Romanday
10-05-2006, 18:36
Ich hab versucht die Variable mit -v zu übergeben, aber ich kann sie immer noch nicht im regulären Ausdruck verwenden, weil die Variable als solche nicht erkannt wird, da sie in Schrägstrichen steht.
Kannst du mir vielleicht ein Beispiel geben?

Poste mal bitte dein Beispiel, wie weit Du zur Zeit bist ....

musketaquid
11-05-2006, 15:31
Ich habe ein script, das mir die Kindprozesse listet:

#!/bin/bash
#
# usage: patree process
#
# list children of given process as tree
#
ps -eo fname -H | awk -v PROCESS="/$1/" 'PROCESS {i = gsub(/ /,"&",$0); \
printf $0"\n"; getline; while (gsub(/ /,"&",$0) > i) printf $0"\n", getline; nex
t;}'
Der erste Parameter des scripts, ist der Elternprozess, nach dem gesucht werden soll. Also hab ich "$1" mit der Option -v an awk übergeben. Das Problem ist, dass die Variable PROCESS als Suchmuster für den Regulären Ausdruck dienen soll.
Wenn ich z.B. das script mit dem Parameter Eterm aufrufe, dann sollte eigentlich vor der geschweiften Klammer '/Eterm/ {...}' stehen. Das tut es aber nicht. Warum?

Romanday
12-05-2006, 03:29
Ich habe ein script, das mir die Kindprozesse listet:
Das Problem ist, dass die Variable PROCESS als Suchmuster für den Regulären Ausdruck dienen soll.
Wenn ich z.B. das script mit dem Parameter Eterm aufrufe, dann sollte eigentlich vor der geschweiften Klammer '/Eterm/ {...}' stehen. Das tut es aber nicht. Warum?

Das ist MurksePurkse.
Du hast dich sicherlich schon mit anderen Programmier- o. Scriptsprachen
beschäftigt. Das sehe daran, wie du das Problem lösen möchtest.
Werfe das mal weg, das hat nicht mit awk zu tun. Las deine awk
Schleifen mal weg, und überlege dann warum es trotzdem funktioniert.

Du mußt unterscheiden, wie erkennt die Shell eine Variable und wie awk?
Weiterhin, willst du unbedingt einen Baumschnitt (ist doch was für den
Herbst oder Frühjahr :D) oder reichen dir die Prozesse aus?

..
Leichter ist es für dich ps über grep zu pipen und dann mit awk zu formatieren.:D

musketaquid
12-05-2006, 14:15
Das ist MurksePurkse. Kann gut sein :D

Du mußt unterscheiden, wie erkennt die Shell eine Variable und wie awk?
Die shell macht das ja über das vorangestellte $ Zeichen, aber bei awk :confused:
In /usr/share/doc/gawk/examples... gibt's das script:

BEGIN {
RS = ORS = "\r\n"
if (MyPort == 0) MyPort = 8080
HttpService = "/inet/tcp/" MyPort "/0/0"
Hello = "<HTML><HEAD><TITLE>Out Of Service</TITLE>" \
"</HEAD><BODY><H1>" \
"This site is temporarily out of service." \
"</H1></BODY></HTML>"
Len = length(Hello) + length(ORS)
while ("awk" != "complex") {
print "HTTP/1.0 200 OK" |& HttpService
print "Content-Length: " Len ORS |& HttpService
print Hello |& HttpService
while ((HttpService |& getline) > 0)
continue;
close(HttpService)
}
}

Wenn man sich hier die Variablen Helllo und Len anschaut, dann werden die einfach so verwendet ohne irgendwelche besonderen Erkennungszeichen.
Und ich glaub in awk werden nur Built-in Variablen und Arrays groß geschrieben, also hab ich gleich mal aus PROCESS Process gemacht.
Also ich bin der Meinung, das außerhalb der geschweiften Klammern mit Variablen gar nix zu machen ist, aber du hast ja gesagt:
Ja, geht. Mußt du vorher mit -v übergeben.

Romanday
12-05-2006, 23:07
Und ich glaub in awk werden nur Built-in Variablen und Arrays groß geschrieben, also hab ich gleich mal aus PROCESS Process gemacht.


Damit reduzierst Du das Risiko ungewollt eine
Voreinstellung zu überschreiben.


Kann gut sein :D
Also ich bin der Meinung, das außerhalb der geschweiften Klammern mit Variablen gar nix zu machen ist, aber du hast ja gesagt:

Wenn Du eine Variable deklariert hast, kannst du auch überall
darauf zugreifen (BEGIN,END, {} etc.).

Wie gesagt, es führen 1000 + 1 Wege nach Rom. Wenn Du noch nicht
so fit bist in awk, dann benutze awk nur als Ergänzung.
Nur dort wo der Aufwand mit der Shell größer oder unhandlicher
wäre.
Es gibt genügend Tools, Programme ... welche REGEX ausführen.
Alles kannst Du in einem Shellscript zusammenbinden.