Kleines Problem im Shell Script :)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
cfour
Beiträge: 5
Registriert: 24.08.2013 01:02:11

Kleines Problem im Shell Script :)

Beitrag von cfour » 24.08.2013 01:06:28

Hallo

ich steh etwas auf dem Schlauch...es ist wahrscheinlich recht einfach zu lösen.

Code: Alles auswählen

TMP=`echo $HTML | \
    tr "\t\r\n'" '   "' | \
    grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
    sed -e 's/^.*"\([^"]\+\)".*$/\1/g'`

  for j in $TMP; do
     echo $j
  done
Aus einem HTML Code möchte ich einfach alle Verlinkungen raussuchen. Das funktioniert auch soweit..bis auf Links mit Leerzeichen, da diese dann in der for Schleife getrennt werden. Mir fällt so recht aber keine Lösung dafür ein :)

Gruss, cfour

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Kleines Problem im Shell Script :)

Beitrag von r900 » 24.08.2013 01:30:25

Wenn du das siehst setzt bestimmt der Kopf->Tischplatte Reflex ein :P

Code: Alles auswählen

for j in "$TMP"; do
...
Du könntest auch vorher Leerzeichen durch %20 ersetzen.

In ruby lässt sich das allerdings wesentlich schöner machen weil man einen HTML-parser benutzen kann. Siehe z.B. hier (sehr ausfuehrlich): http://ruby.bastardsbook.com/chapters/html-parsing/

cfour
Beiträge: 5
Registriert: 24.08.2013 01:02:11

Re: Kleines Problem im Shell Script :)

Beitrag von cfour » 24.08.2013 11:10:54

r900 hat geschrieben:Wenn du das siehst setzt bestimmt der Kopf->Tischplatte Reflex ein :P

Code: Alles auswählen

for j in "$TMP"; do
...
Du könntest auch vorher Leerzeichen durch %20 ersetzen.

In ruby lässt sich das allerdings wesentlich schöner machen weil man einen HTML-parser benutzen kann. Siehe z.B. hier (sehr ausfuehrlich): http://ruby.bastardsbook.com/chapters/html-parsing/
das hatte ich schon probiert...ABER auch dann trennt er weiterhin...überall wo leerzeichen oder %20 auftauchen, erhalte ich eine neue Zeile. Ruby wäre wohl zu langsam...die Performance spielt eine große Rolle. Wobei ich meine o.g. Lösung da auch noch eher langsam empfinde.

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Kleines Problem im Shell Script :)

Beitrag von r900 » 24.08.2013 12:33:04

cfour hat geschrieben:ABER auch dann trennt er weiterhin...überall wo leerzeichen oder %20 auftauchen, erhalte ich eine neue Zeile.
Ach ja, dumm von mir. Mit Anführungszeichen nimmt er alles als einen String. Du musst IFS (internal field seperator) neu setzen.

Code: Alles auswählen

OLDIFS=$IFS
IFS=$'\n'
for j in $TMP; do
  echo "$j"
done
IFS=$OLDIFS
Was die Geschwindigkeit angeht könnte ruby sogar besser sein, denn tr + grep + sed kostet auch Zeit.

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Kleines Problem im Shell Script :)

Beitrag von r900 » 24.08.2013 14:27:32

Die Ausgabe von grep ist durch newlines getrennt. D.h. bei deinem sed-Muster kannst du dir das "g" am Ende sparen.
Oder gleich ganz ohne sed, etwa so:

Code: Alles auswählen

while IFS=\" read -r _ link _; do
  echo "$link"
done < <(echo "$HTML" | tr .... | grep -i -o ...)
Anm.: <( .. ) funktioniert nur mit bash (nicht mit sh/dash).
Übrigens solltest du das $HTML auf jeden Fall in Anführungszeichen setzen. Vergleich einfach mal die Ausgabe von diesem Beispiel:

Code: Alles auswählen

TMP=$(echo -e 'ANFANG\n\n*\n\nENDE')
echo "$TMP"
echo $TMP

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Kleines Problem im Shell Script :)

Beitrag von Phineas » 24.08.2013 18:20:11

Es gibt ziemlich verhunzte HTML-Codes im Web. Die Browser/Parser sind da ziemlich Fehlertolerant. Ein solcher Parser ist also zu empfehlen. Ich benutze noch den alten Lynx dafür. Der ist tolerant und schnell:

Code: Alles auswählen

lynx <URL> -listonly -dump
Man muss noch ein wenig weiter filtern, aber Leerzeichen sind keine mehr zu erwarten.

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Kleines Problem im Shell Script :)

Beitrag von r900 » 25.08.2013 03:37:09

Phineas hat geschrieben:Man muss noch ein wenig weiter filtern, aber Leerzeichen sind keine mehr zu erwarten.
Das Filtern kann man sich sparen:

Code: Alles auswählen

$ lynx -listonly -dump -nonumbers <URL>

cfour
Beiträge: 5
Registriert: 24.08.2013 01:02:11

Re: Kleines Problem im Shell Script :)

Beitrag von cfour » 25.08.2013 15:23:43

r900 hat geschrieben:
Phineas hat geschrieben:Man muss noch ein wenig weiter filtern, aber Leerzeichen sind keine mehr zu erwarten.
Das Filtern kann man sich sparen:

Code: Alles auswählen

$ lynx -listonly -dump -nonumbers <URL>
vielen vielen Dank :) War mir schon eine große Hilfe. Die Idee mit lynx ist natürlich sehr schön...nur ist das wirklich schneller als wget etc?

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Kleines Problem im Shell Script :)

Beitrag von r900 » 25.08.2013 18:07:29

cfour hat geschrieben:Die Idee mit lynx ist natürlich sehr schön...nur ist das wirklich schneller als wget etc?
Das kannst du mit time leicht herausfinden.

cfour
Beiträge: 5
Registriert: 24.08.2013 01:02:11

Re: Kleines Problem im Shell Script :)

Beitrag von cfour » 25.08.2013 21:18:07

Es ist schneller :) Leider habe ich jetzt ein neues Problem. Kann ich lynx nicht dazu bewegen, nur die Link Liste auszugeben? Also ohne die dump page...bei Images geht das nämlich schied. Die manual hat mich leider nicht weiter gebracht.

Es ginge natürlich ein einfaches lynx | grep http aber das wirkt sich dann wieder negativ auf die Performance aus.

Gruss, cfour

edit: -listonly gibt es scheinbar nicht mehr

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Kleines Problem im Shell Script :)

Beitrag von r900 » 25.08.2013 21:49:35

cfour hat geschrieben:edit: -listonly gibt es scheinbar nicht mehr
In welcher Version? Bei 2.8.8dev.12-2 aus Debian Wheezy gibt es sie jedenfalls. Könnte sein dass es sie in deiner Version noch nicht gibt: Debian Bugreport255571

cfour
Beiträge: 5
Registriert: 24.08.2013 01:02:11

Re: Kleines Problem im Shell Script :)

Beitrag von cfour » 25.08.2013 22:05:04

r900 hat geschrieben:
cfour hat geschrieben:edit: -listonly gibt es scheinbar nicht mehr
In welcher Version? Bei 2.8.8dev.12-2 aus Debian Wheezy gibt es sie jedenfalls. Könnte sein dass es sie in deiner Version noch nicht gibt: Debian Bugreport255571
Lynx Version 2.8.8dev.5 (25 Aug 2010)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Kleines Problem im Shell Script :)

Beitrag von Cae » 25.08.2013 22:51:31

Klingt nach Squeeze, also oldstable. Vielleicht solltest du auf Wheezy hochziehen? Das musst du eh innerhalb des naechsten Dreivierteljahres machen, da kannst du auch gleich von einem aktuelleren/weniger verbuggten Lynx profitieren.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Kleines Problem im Shell Script :)

Beitrag von Phineas » 26.08.2013 05:40:11

Ich habe den Uropa - und er kann listonly:

Code: Alles auswählen

~> lynx -version
Lynx Version 2.8.6rel.5 (09 May 2007)
cfour hat geschrieben:...bei Images geht das nämlich schied.
Hast Du einen Image-Download mal direkt mit wget und den folgenden drei Optionen getestet bzw. hilft Dir das weiter?

Code: Alles auswählen

~> man wget
...
       -r
       --recursive
           Turn on recursive retrieving.
...
       -l depth
       --level=depth
           Specify recursion maximum depth level depth.  The default maximum depth is 5.
...
       -A acclist
       --accept acclist
..

Antworten