Hilfe bei kleinem, einfachem awk-Skript [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Hilfe bei kleinem, einfachem awk-Skript [gelöst]

Beitrag von Duff » 27.02.2007 08:41:41

Hallo,

ich habe eine Frage zu einem kleinen awk-Skript.

Und zwar macht das Skript nicht viel außer dass es nach einem Suchmuster in einer Datei schaut und dessen vorkommen zählt und ausgibt.

Code: Alles auswählen

#!/usr/bin/awk -f
/Suchmuster/ { x++ }
END { print "SUMME:", x }
Nun würde ich aber gerne noch eine Prüfung mit einbauen. Und zwar soll überprüft werden, ob eine Datei angegeben wurde und wenn nicht soll das Programm beendet werden.

Habe es schon mit verschiedenen if-Anweisungen versucht (und auch BEGIN-Blöcken) aber ich mache immer irgendwas falsch. Das Programm meldet dann immer einen Fehler beim Suchmuster.

Danke.
Zuletzt geändert von Duff am 05.03.2007 12:54:05, insgesamt 1-mal geändert.
Oh, yeah!

Benutzeravatar
debdog
Beiträge: 652
Registriert: 11.02.2007 10:53:12
Wohnort: Do,womrkoihochdeitschko

Beitrag von debdog » 27.02.2007 12:34:37

Hi Duff,

hab' jetzt nicht soviel Ahnung von awk denke aber, daß awk einen Aufruf wie if[]; then; fi nicht unterstützt. Diese werden von der Shell zur Verfügung gestellt, d.h. du müsstest ein Shellscript welches awk ausführt, anstatt eines awk-Scripts, bauen.

Zum Beispiel so:

Code: Alles auswählen

#!/bin/sh
if [ "$1" != "" -a -e "$1" ]; then
   awk ...
fi
Grüsse alex

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 27.02.2007 14:12:35

mit gawk funktioniert das:

Code: Alles auswählen

root@gms2:~# cat x.awk
#!/usr/bin/awk -f
BEGIN { if ( ARGC==1 ) { exit } }
/Suchmuster/ { x++ }
END{ if ( length(x)>0 ) { print "SUMME:", x } }
root@gms2:~# ./x.awk
root@gms2:~# ./x.awk x.txt
SUMME: 1
Gruß
gms

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von goeb » 27.02.2007 14:18:43

So klappts:

Code: Alles auswählen

awk 'BEGIN {if (ARGV[1] == "") exit} /search/ {x++} END {print x}' <files>
MfG, goeb

Edit: gms war schneller...

Benutzeravatar
debdog
Beiträge: 652
Registriert: 11.02.2007 10:53:12
Wohnort: Do,womrkoihochdeitschko

Beitrag von debdog » 27.02.2007 20:05:30

Hallo,
das ist ja interessant hätt ich jetzt wirklich nicht gedacht. Und die Syntax ist gar ned so schlecht, muss mich mal nähers damit befassen. Schon wieder was dazugelernt :-)

Interessant auch die beiden Antworten zu vergleichen.

Danke

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 28.02.2007 08:41:32

Wow, super.
Danke.

Beide Varianten funktionieren super. Ich hatte es auch so ähnlich probiert aber ich hatte das BEGIN vergessen oder falsch verwendet.

Habe bei keiner angabe einer Variablen noch eine print-Anweisung mit eingebaut.

Code: Alles auswählen

BEGIN { if ( ARGC==1 ) { print "Kein Parameter!";exit } }
...
Vielen Dank nochmal!
Oh, yeah!

Antworten