• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Programmieraufgabe zu grep, awk und sed

abgdf

Guru
Hi,

hier mal eine kleine Programmieraufgabe für Interessierte (weil sich das gerade anbot):
Wandele mit Hilfe jeweils einer Zeile grep, awk und sed den Quelltext der Seite

http://www.bushgrafts.com/jazz/midi.htm

(das heißt also die Datei "midi.htm") so um, daß die darin enthaltenen Links im Klartext ausgegeben werden. Die Ausgabe soll also z.B. so aussehen:
Code:
http://www.bushgrafts.com/jazz/Midi site/afine-2.mid
http://www.bushgrafts.com/jazz/Midi site/Aghostofachance.mid
http://www.bushgrafts.com/jazz/Midi site/AHouseis.mid
http://www.bushgrafts.com/jazz/Midi site/Anighting.mid
http://www.bushgrafts.com/jazz/Midi site/ARemarkYouMade.mid
und so weiter. Dabei können die temporären Dateien "out1" und "out2" verwendet werden. Das Skript soll also so aussehen:
Code:
#!/bin/bash

grep ... ./midi.htm
awk ...
sed ...

rm ./out1 ./out2
Viel Spaß! ;)
 
A

Anonymous

Gast
abgdf schrieb:
Das Skript soll also so aussehen:
Code:
#!/bin/bash

grep ... ./midi.htm
awk ...
sed ...

rm ./out1 ./out2
Also nicht etwa so hier ;)
Code:
awk -F \" '/\.mid/{gsub("%20"," ",$2);gsub("%28","(",$2);gsub("%29",")",$2);gsub("%27",'\"\'\"',$2);print $2}'  ./midi.htm
na, ja notfalls kann man ja noch einen sinnlosen leeren grep und sed Befehl zusätzlich mit dazu schreiben, aber wozu sind die beiden temporären Dateien gedacht?
geht aber wahrscheinlich auch in einer einzigen sed-Zeile

nette Übung übrigens. ;)
Zählt auch nur Bash, also nur alles was in der Bash selbst drin ist, ohne auch nur irgend eine Kommando aus dem Dateisystem zu laden
Code:
while read A ; do  case $A in  *\"*.mid\"*) B=${A#*\"};C=${B%%\"*};D=${C//"%20"/" "};E=${D//"%28"/\(};F=${E//"%29"/\)};echo ${F//"%27"/\'};; esac; done  < midi.htm


robi
 
OP
A

abgdf

Guru
robi schrieb:
Also nicht etwa so hier ;)
Code:
awk -F \" '/\.mid/{gsub("%20"," ",$2);gsub("%28","(",$2);gsub("%29",")",$2);gsub("%27",'\"\'\"',$2);print $2}'  ./midi.htm
na, ja notfalls kann man ja noch einen sinnlosen leeren grep und sed Befehl zusätzlich mit dazu schreiben, aber wozu sind die beiden temporären Dateien gedacht?
Also gut, TMTOWTDI. ;)

Du bist ja auch fast da: Dein Code zieht die Daten 'raus, jetzt brauchst Du aber noch 'nen sed, um die beabsichtigte Ausgabe (s.o.) hinzubekommen.
Außerdem setzt Dein awk-Befehl ja ein tieferes Verständnis von awk voraus, gsub()-Funktion, usw.. Ich dachte mehr an den durchschnittlichen bash-Skript-Schreiber, der das wohl nicht hat.
Der würde sich die zu bearbeitenden Zeilen wohl erstmal mit grep ziehen ...
Aber schön, daß Du mal drübergeguckt hast. ;)
 
OP
A

abgdf

Guru
Hier dann noch, wie ich mir die Lösung gedacht hatte:
Code:
#!/bin/bash

grep ".mid" midi.htm > out1
awk -F "href=\"" '{print $2}' out1 | awk -F "\">" '{print $1}' > out2
sed -e 's/Midi site/http:\/\/www.bushgrafts.com\/jazz\/Midi site/' out2

rm ./out1 ./out2
Erwischt tatsächlich nicht alle Adressen, aber das liegt daran, daß die html-Seite nicht sauber geschrieben ist.

Ich hatte die Befehle natürlich ursprünglich auf der Konsole einzeln ausgeführt, und mich dann gewundert, wie gut das mit ein paar kurzen, grundlegenden bash-Befehlen klappt.
Es mit längerem Code in einer Skript-Sprache zu lösen, ist natürlich auch möglich, war aber hier nicht unbedingt gemeint.
 
A

Anonymous

Gast
Halt mal, nicht so schnell. ;)

Irgend etwas stimmt dort aber nicht, Aufgabe war wie folgt definiert:
abgdf schrieb:
(das heißt also die Datei "midi.htm") so um, daß die darin enthaltenen Links im Klartext ausgegeben werden. Die Ausgabe soll also z.B. so aussehen:
Code:
http://www.bushgrafts.com/jazz/Midi site/afine-2.mid
http://www.bushgrafts.com/jazz/Midi site/Aghostofachance.mid
http://www.bushgrafts.com/jazz/Midi site/AHouseis.mid
http://www.bushgrafts.com/jazz/Midi site/Anighting.mid
http://www.bushgrafts.com/jazz/Midi site/ARemarkYouMade.mid
und so weiter.
Dein Code produziert bei mir aber folgendes:
Code:
http://www.bushgrafts.com/jazz/Midi%20site/afine-2.mid
http://www.bushgrafts.com/jazz/Midi%20site/Aghostofachance.mid
http://www.bushgrafts.com/jazz/Midi%20site/AHouseis.mid
http://www.bushgrafts.com/jazz/Midi%20site/Anighting.mid
http://www.bushgrafts.com/jazz/Midi%20site/ARemarkYouMade.mid
http://www.bushgrafts.com/jazz/Midi%20site/A%20Sleepin%27%20Bee.mid
http://www.bushgrafts.com/jazz/Midi%20site/AfterYou.mid
du bist noch lange nicht fertig. da sind noch "%20" "%27" "%28" "%29" drin und so wie ich die Aufgabe verstanden habe, müssen diese auch noch umgesetzt werden. zB.
Code:
http://www.bushgrafts.com/jazz/Midi site/A Sleepin' Bee.mid
http://www.bushgrafts.com/jazz/Midi site/Bach Prelude No 1 (Ave Maria).mid
http://www.bushgrafts.com/jazz/Midi site/Do I Love You Because you're Beautiful.mid
http://www.bushgrafts.com/jazz/Midi site/Goin'_Home_(Real_Time)_(Antonin_Dvorak).mid
dass war zumindestens unter awk schon eine recht ordentlichen Herausforderung besonders das '
das würde bei sed zu einem absolut unleserlichen Regex führen, wenn du das in einer Zeile versuchst.
allerdings mit nackter bash wars relativ einfach.

entweder hast du dich also nicht an deine eigenen Vorgaben gehalten, oder wir haben falsch verstanden was du überhaupt machen wolltest.
Und AWK hast du auch noch in ein zweites AWK gepiped, lasse ich so nicht gelten. ;) jeweils ein Befehl pro Zeile hatte ich verstanden.
Was deine ganzen Zeile bis jetzt machen ist, nichts weiter als
Code:
awk -F \" '/\.mid/{print $2}'  ./midi.htm
nur eben besonders umständlich. Da üben wir aber schon noch, oder ;) ;) ;)

robi
 
OP
A

abgdf

Guru
robi schrieb:
Dein Code produziert bei mir aber folgendes:
Code:
http://www.bushgrafts.com/jazz/Midi%20site/afine-2.mid
http://www.bushgrafts.com/jazz/Midi%20site/Aghostofachance.mid
http://www.bushgrafts.com/jazz/Midi%20site/AHouseis.mid
http://www.bushgrafts.com/jazz/Midi%20site/Anighting.mid
http://www.bushgrafts.com/jazz/Midi%20site/ARemarkYouMade.mid
http://www.bushgrafts.com/jazz/Midi%20site/A%20Sleepin%27%20Bee.mid
http://www.bushgrafts.com/jazz/Midi%20site/AfterYou.mid
du bist noch lange nicht fertig.
Das Problem tritt bei mir nicht auf. Wahrscheinlich liegt es am Encoding.
robi schrieb:
Code:
awk -F \" '/\.mid/{print $2}'  ./midi.htm
Gefällt mir!
 
Oben