awk und globale Variablen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
j A n
Beiträge: 86
Registriert: 19.12.2004 11:16:00
Kontaktdaten:

awk und globale Variablen

Beitrag von j A n » 06.09.2005 13:32:05

Hallo,

ich habe folgende Zeile in meinem Script.

Code: Alles auswählen

cat /etc/passwd | grep schueler*[0-90-90-90-9] | awk -F: '{print "cp " $datei "/home/" $1}' 
Die Zeile soll dieses hier ausgeben:

"cp "datei" /home/schuelerxxxx"

Die Datei wird mit dem 1. Parameter des Scripts eingegeben ($1).
Nur kennt awk die Variable $1 nicht bzw. für awk wäre das der 1. gefilterte Teil von /etc/passwd.

Kann ich das irgendwie ändern ?
MfG

j A n

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 06.09.2005 13:39:40

In deinem Fall ist es das einfachste, die einfachen Anführungszeichen durch Gänsefüßchen zu ersetzen, dann setzt die Shell $1 und $datei automatisch ein.

j A n
Beiträge: 86
Registriert: 19.12.2004 11:16:00
Kontaktdaten:

Beitrag von j A n » 06.09.2005 14:22:37

$datei ist eine Variable die ich an den awk befehl übergebe und $1 ist das rausgefilterte von /etc/passwd.

Problem ist das er die Varable $datei innerhalt von awk nicht kennt.
Mit den Gänsefüßchen würde er dann die $1 nicht mehr erkennen.
MfG

j A n

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 06.09.2005 14:30:47

Code: Alles auswählen

cat /etc/passwd | grep schueler*[0-90-90-90-9] | awk -F: '{printf("cp '$datei' /home/ '$1'")}' 
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 06.09.2005 14:40:17

Code: Alles auswählen

awk -F: -vdatei=$datei '{print "cp " datei "/home/" $1}'

j A n
Beiträge: 86
Registriert: 19.12.2004 11:16:00
Kontaktdaten:

Beitrag von j A n » 06.09.2005 14:42:39

Hallo Savar,

leider hat deine Lösung nicht ganz hingehauen. Ich hab mir das jetzt mal so zusammengewurschtelt und nur gehts:

Code: Alles auswählen

cat /etc/passwd | grep schueler*[0-90-90-90-9] | awk -F: '{print("cp '$datei' /home/"$1)}'
MfG

j A n

codi
Beiträge: 120
Registriert: 18.10.2004 20:20:22

Beitrag von codi » 08.09.2005 13:54:40

Hallo, das interessiert mich jetzt aber auch ;-)...

Also wenn ich ein Script mit Argumenten aufrufe, kann ich diese innerhalb des Scriptes in ihrer gegebenen Reihenfolge verwenden. z.B.
$1=Argument1
$2=Argument2
...
soweit sogut, ok...

awk wendet ebenfalls diese Variablenamen, allerdings werden diese über StdIn übergeben. $0 wird mittels FieldSeperator in $1 $2 ... $n zerlegt. Wie kann man jetzt innerhalb eines Scriptes eine Variable an awk übergeben?

Code: Alles auswählen

cat /etc/passwd | grep schueler*[0-90-90-90-9] | awk -F: '{print("cp '$datei' /home/"$1)}' 
Woher weiß awk dass $datei das Argument ist welches beim Aufrufen des Scriptes angegeben wurde?

MfG
Codi

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 08.09.2005 14:34:22

dadurch das ich es auftrenne

'{print("cp '$datei' /home/"$1)}'

nur was in Rot ist, wird direkt an gawk übergeben... danke der "stoppendem" --> ' <-- kann ich die Variable vorher von der Bash ersetzen lassen und anschließend mit einem "startendem" --> ' <-- wieder das gawk Skript weiterlaufen lassen
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

codi
Beiträge: 120
Registriert: 18.10.2004 20:20:22

Beitrag von codi » 09.09.2005 08:20:54

Haha, also fehlt bei dem o.g. Beisiel nocht die Zeile mit datei=$1,...
Ja dann liegts auf der Hand. Aber wenn das so ist, kann ich auch direkt '$1' verwenden. Wird nur etwas unübersichtlich...

Code: Alles auswählen

'{print("cp '$1' /home/"$1)}' 
Danke und Gruß
Codi

Antworten