awk, sed, parameter

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

awk, sed, parameter

Beitrag von rechenzentrum » 09.06.2011 03:53:38

Guten Tag alle zusammen,

ich versuche seit 2 Tagen folgendes Problem zu lösen:
ich habe ein awk-Script und möchte darin ein Wort durch eine Variable ersetzen:
awk -f script.awk -v var=hallo text.txt

Code: Alles auswählen

/pattern/ {gefunden=1}
gefunden{print}
ich moechte pattern durch $var ersetzen, ich habe mehrere Variationen ausprobiert, leider klappt es nicht.

Code: Alles auswählen

/$var/ {gefunden=1}
/'$var'/ {gefunden=1}
/"$var"/ {gefunden=1}
/${var}/ {gefunden=1}
/${print $var}/ {gefunden=1}
/${print var}/ {gefunden=1}
nichts funktioniert, kann mir jemand helfen?

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: awk, sed, parameter

Beitrag von ThorstenS » 09.06.2011 05:05:46

# Bash Variablen in AWK nutzen:
MyVar=86; awk '{ print ENVIRON[MyVar] }'
MyVar=85; awk -v n=$MyVar '{print n}'
MyVar=84; awk '{print "'"$MyVar"'" }'

rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

Re: awk, sed, parameter

Beitrag von rechenzentrum » 09.06.2011 05:08:39

Danke!
ich versuche es mal, so weit ich es aber richtig beurteile funktioniert das nicht als pattern.

rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

Re: awk, sed, parameter

Beitrag von rechenzentrum » 09.06.2011 05:10:29

leider funktioniert es nicht. 8O

yeti

Re: awk, sed, parameter

Beitrag von yeti » 09.06.2011 05:25:42

Code: Alles auswählen

$ echo -e 'a1\nb2\nc3\nd4'
a1
b2
c3
d4
$ echo -e 'a1\nb2\nc3\nd4' | awk -vs=c 'match($0,s) { print s " gefunden bei position " RSTART " in zeile " NR }'
c gefunden bei position 1 in zeile 3
Vielleicht Sowas?
Das echo generiert nur Testdaten, der awk-Teil sucht den in der Variable s als Parameter angegebenen Ausdruck...

rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

Re: awk, sed, parameter

Beitrag von rechenzentrum » 09.06.2011 05:32:20

Eine gute Idee, allerdings passt es nicht zu meinem Konzept.
ich rufe mein Script folgendermassen auf:
awk -f script.awk -v var=hallo text.txt


script.awk:

Code: Alles auswählen

/pattern/ {gefunden=1}
gefunden{print}
das pattern möchte ich aber uber die Variable var ersetzen. wenn ich aber

Code: Alles auswählen

/$var/ 
schreibe, sucht er nach $var und nicht, nach dem Wert, der in $var drinne steht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9247
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk, sed, parameter

Beitrag von Meillo » 09.06.2011 09:41:57

yeti hat den entscheidenden Tipp schon gegeben: Du kannst das Pattern nicht direkt als Bedingung angeben sondern musst explizit entweder match() oder ~ verwenden:

Code: Alles auswählen

var ~ $0 {...}
match($0, var) {...}
rechenzentrum hat geschrieben:Eine gute Idee, allerdings passt es nicht zu meinem Konzept.
Falls du das auf yetis Vorschlag bezogen hast, dann kann ich sagen, dass das nichts damit zu tun hat.
ich rufe mein Script folgendermassen auf:
awk -f script.awk -v var=hallo text.txt
Ich bin der Meinung, dass es fast immer sinnvoll ist awk-Scripte in Shellscripte zu verpacken:

Code: Alles auswählen

#!/bin/sh
... # Argumentverarbeitung
awk '
   .... # awk Script
'
Dann kann man auch problemlos Variablenwerte irgendwo ``hinkopieren''.

script.awk:

Code: Alles auswählen

/pattern/ {gefunden=1}
gefunden{print}
Wenn es um genau diese Funkionalitaet geht, dann moechte ich sed in den Raum werfen:

Code: Alles auswählen

sed -n '/pattern/,$p'
Und verpackt (ohne Fehlerbehandlung und so):

Code: Alles auswählen

#!/bin/sh
sed -n /"$1"',$p'
Use ed once in a while!

rechenzentrum
Beiträge: 76
Registriert: 09.06.2011 03:45:35

Re: awk, sed, parameter

Beitrag von rechenzentrum » 09.06.2011 09:46:51

:hail: Die Meister haben gesprochen und der Lehrling hat's endlich gerallt!
Es funktioniert endlich, danke euch!
:THX: :THX: :THX: :THX:

Antworten