Grep Befehl

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Yogisda
Beiträge: 4
Registriert: 14.01.2015 23:41:37

Grep Befehl

Beitrag von Yogisda » 14.01.2015 23:51:11

Guten Abend liebe Community,

Ich brauche eure Hilfe, ich arbeite gerade an meinen Abgaben für die FH und bin an dieser Stelle hängen geblieben.

Das ist der Code:

#!/bin/bash

# Es wird nach den Postleitzahlen mit 8
# gesucht

echo "Treffer: "

# Listeninhalt ist Ergebnis einen Kommandos
grepliste=$(egrep -o "plz=$|[0-9]{3,5}" personen.xml -nm5)

# $liste[*] liefert einfach den kompletten
# Inhalt der Liste
for erg in ${grepliste[*]}
do
echo $erg
done

Diese Ausgabe gibt zwar die Postleitzahlen aus aber mein Problem liegt darin die Postleitzahl mit 7 auszugrenzen.
Auf diesem Link befindet sich die Aufgabe und die XML Datei ist auch aufm Bild zu sehen. http://imgur.com/4G3xHVG

Mit freundlichen Grüßen
Yogisda

Benutzeravatar
ohnex
Beiträge: 392
Registriert: 31.01.2010 22:35:36

Re: Grep Befehl

Beitrag von ohnex » 15.01.2015 00:38:07

hallo

warum nich noch mal grepen, bei mir funktionierts.
Yogisda hat geschrieben:Guten Abend liebe Community,

Ich brauche eure Hilfe, ich arbeite gerade an meinen Abgaben für die FH und bin an dieser Stelle hängen geblieben.

Das ist der Code:

#!/bin/bash

# Es wird nach den Postleitzahlen mit 8
# gesucht

echo "Treffer: "

# Listeninhalt ist Ergebnis einen Kommandos
grepliste=$(egrep -o "plz=$|[0-9]{3,5}" personen.xml -nm5)

# $liste[*] liefert einfach den kompletten
# Inhalt der Liste
for erg in ${grepliste[*]}
do
echo $erg | grep 8[0-9]
done

Diese Ausgabe gibt zwar die Postleitzahlen aus aber mein Problem liegt darin die Postleitzahl mit 7 auszugrenzen.
Auf diesem Link befindet sich die Aufgabe und die XML Datei ist auch aufm Bild zu sehen. http://imgur.com/4G3xHVG

Mit freundlichen Grüßen
Yogisda
edit: sehe gerade die Ausgabe muss mit PLZ1: usw. beginnen

ciao
Zuletzt geändert von ohnex am 15.01.2015 00:55:13, insgesamt 1-mal geändert.

Yogisda
Beiträge: 4
Registriert: 14.01.2015 23:41:37

Re: Grep Befehl

Beitrag von Yogisda » 15.01.2015 00:47:40

Die 5. Zeile gilt aber immer noch als Treffer und die muss ausgegrenzt werden.
Hier ist die Ausgabe: http://imgur.com/VXWMXMe
Edit: Hab grad die [0-9] dazu getan dann hats geklappt :) vielen Dank
Edit2: Ja vielleicht muss hier noch bei "plz=$ | [0-9]{3,5}"
plz=$ | [0-9][a-z]{3,5}

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Grep Befehl

Beitrag von linuxCowboy » 15.01.2015 02:09:44

1.

Code: Alles auswählen

echo Treffer:;j=;for i in `grep -oE '8[0-9]{4}' file`;do ((++j));echo PLZ$j: $i;done
2.

Code: Alles auswählen

echo Treffer:;j=;for i in `grep -oE '8[0-9]{4}' file`;do ((i > 87000))&&((++j))&&echo PLZ$j: $i;done
volle Punktzahl :D
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Inkodiktus
Beiträge: 702
Registriert: 15.08.2013 01:15:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: » host@user╺─╸[~]

Re: Grep Befehl

Beitrag von Inkodiktus » 15.01.2015 02:32:56

linuxCowboy hat geschrieben:1.

Code: Alles auswählen

echo Treffer:;j=;for i in `grep -oE '8[0-9]{4}' file`;do ((++j));echo PLZ$j: $i;done
2.

Code: Alles auswählen

echo Treffer:;j=;for i in `grep -oE '8[0-9]{4}' file`;do ((i > 87000))&&((++j))&&echo PLZ$j: $i;done
volle Punktzahl :D
Jetzt für die Bash Lernwilligen das ganze büüüde büüüde ausführlich erklären.
Vor allem die Option -o kenn ich nicht. :(

Wenn ich mal kurz den Beitrag kappern darf :mrgreen:
Diesen Spruch klebe ichs mir glaub in die Sig rein :mrgreen:
Meine Sprachkenntnisse: nur deutsch
Mein Laptop: http://www.asus.com/Notebooks_Ultrabook ... ifications
Mein Debian: Stable + OpenBox
Mein Editor: Emacs
Meine Devise: Frei bleiben - so lange wie es geht : -)

Benutzeravatar
Livingston
Beiträge: 1453
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Grep Befehl

Beitrag von Livingston » 15.01.2015 06:53:19

Inkodiktus hat geschrieben: Jetzt für die Bash Lernwilligen das ganze büüüde büüüde ausführlich erklären.
Vor allem die Option -o kenn ich nicht. :(
Irgendwann wirst Du es selbst hinkriegen:
man grep hat geschrieben: -o, --only-matching
Anstatt der gesamten Zeile werden nur die passenden (nicht
leeren) Teile ausgegeben. Jeder dieser Teile wird auf einer
eigenen Zeile ausgegeben.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Grep Befehl

Beitrag von uname » 15.01.2015 08:52:51

@Yogisda:
Bitte mal das XML-Original (also in ASCII, z.B. NoPaste) posten. Danke.Hätte gar nicht gedacht, dass nach sich in der Informatik mit Bash-Programmierung auseinandersetzt. Die Screenshots sehen im übrigen irgendwie nach Ubuntu aus ;-) Und echte Informatiker nutzen natürlich nicht Virtualbox sondern Debian nativ ;-)

@linuxCowboy:
Verstanden habe die Programme leider nicht. Aber volle Punkte würde ich nicht geben. Mir scheint es so, dass nicht nach dem XML-Tag "plz" gesucht wurde. Bei einer Abweichung von der Struktur (z.B. "nachname" und "plz" vertauscht, "nachname" beginnt mit "8" ) könnte ich mir Fehler vorstellen. Die sollte man noch eleminieren.

Benutzeravatar
hikaru
Moderator
Beiträge: 13588
Registriert: 09.04.2008 12:48:59

Re: Grep Befehl

Beitrag von hikaru » 15.01.2015 09:12:41

uname hat geschrieben:Die Screenshots sehen im übrigen irgendwie nach Ubuntu aus ;-) Und echte Informatiker nutzen natürlich nicht Virtualbox sondern Debian nativ ;-)
Ich würde mich eher daran reiben, dass Terminalausgaben überhaupt als Screenshots gepostet werden.
uname hat geschrieben:Mir scheint es so, dass nicht nach dem XML-Tag "plz" gesucht wurde. Bei einer Abweichung von der Struktur (z.B. "nachname" und "plz" vertauscht, "nachname" beginnt mit "8" ) könnte ich mir Fehler vorstellen. Die sollte man noch eleminieren.
Man könnte einfach das grep-Kommando um den plz-Teil erweitern und hinterher das "plz" wieder wegschneiden (ungetestet):

Code: Alles auswählen

echo Treffer:;j=;for i in `grep -oE 'plz="8[0-9]{4}' file | grep -oE '[0-9]{5}'`;do ((++j));echo PLZ$j: $i;done
Machen wir hier gerade die Hausaufgaben von jemand anderem?


@Yogsida:
Ein paar Infos zu deinem Kenntnisstand bzw. dem Fortschrit deines Kurses wären interessant. Die Forderung nach einer Schleifenkonstruktion macht nämlich die Aufgabe unnötig kompliziert, könnte aber auf eurem Kenntnisstand nötig sein.

Liffi
Beiträge: 2306
Registriert: 02.10.2004 01:33:05

Re: Grep Befehl

Beitrag von Liffi » 15.01.2015 09:26:41

Du benutzt grep für xml? Mach das bitte nicht :-).
Nimm xmlstarlet oder sonstige Dinge, die für sowas geeignet sind :-).

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Grep Befehl

Beitrag von uname » 15.01.2015 09:27:28

Mal ohne Schleife als "awk". Kann man bestimmt schöner schreiben. Aber "awk" für XML ist auch nicht toll.

Code: Alles auswählen

awk -F'plz="' '{p=substr($2,0,5);if (p>=80000) {print p}}' file
awk -F'plz="' '{p=substr($2,0,5);if (p>=87000) {print p}}' file
file (evtl. Abtippfehler inkl.)

Code: Alles auswählen

<?xml version ="1.0" encoding="UTF-8"?>
<Personen>
<Person vorname"Erna21" nachname="Etepetete" plz="86709"/>
<Person vorname"Hugo09" nachname="Etepetete" plz="72458"/>
<Person vorname"James T." nachname="Etepetete" plz="87802"/>
<Person vorname"Montgomery" nachname="Etepetete" plz="88709"/>
<Person vorname"Rudi" nachname="Ruebezahl" plz="87709"/>
</Personen>
Ich würde mich eher daran reiben, dass Terminalausgaben überhaupt als Screenshots gepostet werden.
Zeigt eben die Windows-Mentalität. Trotz verlangter Bash-Programmierung hat der Entwickler der Aufgaben nicht die Vorteile von ASCII gegenüber Bildern erkannt.

Yogisda
Beiträge: 4
Registriert: 14.01.2015 23:41:37

Re: Grep Befehl

Beitrag von Yogisda » 15.01.2015 10:40:24

@linuxcowboy: Danke das du dir Zeit genommen hast, ich werde dies mal ausprobieren. :)
@uname: Mit ASCII haben wir uns noch nicht auseinander gesetzt. Ich muss Sie dir leider hier pasten :D, das ist die XML Datei.

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<Personen>
<Person vorname="Erna21" nachname="Etepetete" plz="86709"/>
<Person vorname="Hugo09" nachname="Helmchen" plz="72458"/>
<Person vorname="James T." nachname="Kirk" plz="87802"/>
<Person vorname="Montgomery" nachname="Scott77" plz="88709"/>
<Person vorname="Rudi" nachname="Ruebezahl" plz="87709"/>
</Personen>
@hikaru, wir sind nicht fortgeschritten, wir haben erst vor kurzen mit der Shell prog. angefangen, davor haben wir nur einfache Grep-Befehle in der Konsole eingegeben.
@Liffi, ich kann nichts dafür das wir dies mit grep machen, wird so in der Aufgabe verlangt :D

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Grep Befehl

Beitrag von linuxCowboy » 15.01.2015 12:30:53

uname hat geschrieben:

Code: Alles auswählen

awk -F'plz="' '{p=substr($2,0,5);if (p>=80000) {print p}}' file
Originell!

Code: Alles auswählen

awk -F'plz="' 'BEGIN{print "Treffer:"}{p=substr($2,0,5);if (p>=87000) {print "PLZ"++i": "p}}' file
Bonuspunkt :THX:
-der_linux_cowboy --- Besser werden! ... f*** w$$

Yogisda
Beiträge: 4
Registriert: 14.01.2015 23:41:37

Re: Grep Befehl

Beitrag von Yogisda » 16.01.2015 11:27:37

Danke euch alle für eure Hilfe hat geklappt :)

Antworten