Bash oder AWK - Suchmuster auslesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
hobid
Beiträge: 10
Registriert: 24.08.2004 13:48:46

Bash oder AWK - Suchmuster auslesen

Beitrag von hobid » 03.11.2007 21:34:06

Ich möchte mir gerne ein kleines Server-Script schreiben und habe da folgendes Problem.
Wie kann ich ein spezielles Suchmuster direkt via Awk oder Bash auslesen?

Zum Beispiel habe ich folgende Liste und möchte nach allen Begriffen suchen, die Garten enthalten.
  • Ballspiel
  • Rodelbahn
  • Wintergarten
  • Biergarten
  • Rodelbahn
  • Kräutergarten
  • Bergschuhe
Als Ergebnis wünsch ich mir:
  • Winterl
  • Bier
  • Kräuter
Soweit bin ich:

Code: Alles auswählen

grep "(^.*)garten" < inputdatei
Doch wie bekomme, ich dann das lästige "garten" weg?

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Beitrag von Spasswolf » 03.11.2007 21:49:31

So z.B.:

Code: Alles auswählen

grep -i garten Datei | sed s/[Gg]arten//

Benutzeravatar
Night.Hawk
Beiträge: 655
Registriert: 24.05.2003 11:00:39
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Night.Hawk » 03.11.2007 22:02:37

Hi,

das bekommst Du so hin.

Und zwar übergibst Du einen Wert (das Wort) in eine Variable ( bzw. array) und schneidest das ab, was Du nicht brauchst:

wort="Biergarten
echo ${wort:4:2}

Die erste Zahl gibt den Punkt an, ab dem Du abschneiden willst, die zweite Zahl die Länge, wenn ich mit nicht irre ;)

Die Zahlen können ebenfalls Variablen sein! Denn Du musst ja die Länge des Wortes ermitteln :).

Musst halt ein wenig ausprobieren, habe das auch nicht mehr 100%tig im Kopf.

Aber damit sollte das klappen

Viel Spaß beim basteln.

Gruß

Night.Hawk


PS: Ach ja, ich glaube, da muss man immer bei NULL anfangen zu zählen...
________________________________________________
Leben und leben lassen ...

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

Beitrag von gms » 03.11.2007 22:14:47

hätte da noch folgenden Vorschlag

Code: Alles auswählen

sed -n 's/\(.*\)garten.*/\1/ip;'  Datei(en)...
Gruß
gms

hobid
Beiträge: 10
Registriert: 24.08.2004 13:48:46

Beitrag von hobid » 03.11.2007 23:58:15

Vielen Dank für die Antworten.
Eigentlich wollte ich meine Scripts in Bash und awk schreiben, wie es viele Scripte auf Linux auch sind.

Jetzt nach diesen Antworten und auch längeren Internetrecherchen ist mir klargeworden:
- Kleinigkeiten mit Bash auf der Konsole erledigen - Okay
- Bei eigenen Skripten oder Verwaltungstools bleibe ich bei Perl!

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

Beitrag von gms » 05.11.2007 06:59:39

hobid hat geschrieben: Eigentlich wollte ich meine Scripts in Bash und awk schreiben, wie es viele Scripte auf Linux auch sind.
ob du jetzt aus deinem Shell-Script das grep-Kommando oder das sed Kommando aufrufst ist doch eigentlich egal, oder ?
Als reines Shellscript ginge es sicherlich auch, wird aber wahrscheinlich aufwändiger und langsamer als dieser Einzeiler
hobid hat geschrieben:Jetzt nach diesen Antworten und auch längeren Internetrecherchen ist mir klargeworden:
- Kleinigkeiten mit Bash auf der Konsole erledigen - Okay
- Bei eigenen Skripten oder Verwaltungstools bleibe ich bei Perl!
Es gibt auch Perloneliner zum Einbau in Shellscripts geeignet :wink:

Code: Alles auswählen

perl -ne 'print "$1\n" if /(.*)garten/i'  Datei(en)...
Gruß
gms

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

Beitrag von Duff » 05.11.2007 08:34:18

Würde, wenn es noch umfangreicher werden sollte, auch auf ein perl Skript zurück greifen.
Sonst entweder auf den perl-Einzeiler oder den sed-Befehl von gms zurück greifen.
Oh, yeah!

yeti

Beitrag von yeti » 06.11.2007 17:03:00

Code: Alles auswählen

cat DATEI | awk 'match($0,"garten") { print substr($0,1,length($0)-6) }'
... sollte klappen, wenn die Worte einzeln per Zeile in DATEI stehen...

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

Beitrag von gms » 06.11.2007 17:33:45

yeti hat geschrieben:

Code: Alles auswählen

cat DATEI | awk 'match($0,"garten") { print substr($0,1,length($0)-6) }'
... sollte klappen, wenn die Worte einzeln per Zeile in DATEI stehen...
Hier muß "garten" aber leider auch noch am Ende der Zeile stehen, das könnte man aber so umgehen:

Code: Alles auswählen

gms@gms2 ~ $ echo "Kindergartenfest" | awk ' x=match($0,"garten") { print substr($0,1,x-1) }'
Kinder
sollte zusätzlich auch "ignorecase" benötigt werden:

Code: Alles auswählen

gms@gms2 ~ $ echo "KINDERGARTENFEST" | gawk 'BEGIN{IGNORECASE=1} x=match($0,"garten") { print substr($0,1,x-1) }'
KINDER
Das funktioniert aber nur mit gawk. Bei anderen awk's gibts diese Variable nicht und ich kenne auch keine andere Standardmethode mit der awk auf "ignorecase" gesetzt werden kann. Kennt da vielleicht jemand eine ?

Das ist eigentlich der Hauptgrund, warum ich mir awk ziemlich abgewöhnt habe

Gruß
gms

yeti

Beitrag von yeti » 06.11.2007 18:20:41

Die Variable x ist überflüssig, dafür gibt's RSTART.

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

Beitrag von Duff » 07.11.2007 08:46:51

gms hat geschrieben:
Das funktioniert aber nur mit gawk. Bei anderen awk's gibts diese Variable nicht und ich kenne auch keine andere Standardmethode mit der awk auf "ignorecase" gesetzt werden kann. Kennt da vielleicht jemand eine ?

Das ist eigentlich der Hauptgrund, warum ich mir awk ziemlich abgewöhnt habe

Gruß
gms
Man kann doch, auch wenn es etwas umständlicher ist, in awk mit [A-Za-z0-9] oder was man sonst noch braucht arbeiten.
Wäre doch eine Art alternative, oder?
Oh, yeah!

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

Beitrag von gms » 07.11.2007 10:39:27

Duff hat geschrieben: Man kann doch, auch wenn es etwas umständlicher ist, in awk mit [A-Za-z0-9] oder was man sonst noch braucht arbeiten.
Wäre doch eine Art alternative, oder?
klar, nur ist der Spaßfaktor meistens sehr gering::

Code: Alles auswählen

gms@gms2 ~ $ echo "KINDERGARTENFEST" | awk ' x=match($0,"[gG][aA][rR][tT][eE][nN]") { print substr($0,1,x-1) }'
KINDER
eine Alternative wäre auch "toupper" bzw "tolower" zu verwenden:

Code: Alles auswählen

gms@gms2 ~ $ echo "KINDERGARTENFEST" | awk ' x=match(tolower($0),"garten") { print substr($0,1,x-1) }'
KINDER
Gruß
gms

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

Beitrag von Duff » 07.11.2007 10:42:18

Stimmt, mit toupper oder tolower ist es noch ein weniger Schreibarbeit und "sieht besser aus" ;-)
Oh, yeah!

Antworten