[PROBLEM] Shellscript mit wget und sed

  • Und wieder einmal probier ich etwas, das ich nicht kann :-))


    Also .. genaugenommen kann ichs mir nur nicht VORSTELLEN, wies gehen könnte ..


    Worum gehts:
    Ich hol mir per wget eine Liste von Links, von einer php-Seite. Die Liste wurde aus einer dynamischen Datenbank generiert.
    Per sed kürze ich die Liste auf die relevanten Dinge - also nur die Links - runter. In jeder Zeile der Datei steht jetzt ein Link.


    JETZT kommt der Punkt, an dem ich noch etwas anstehe:
    Ich möchte jetzt per wget jeden Link abrufen, die runtergeladene Datei nach einem oder mehreren Schlüsselwörtern durchsuchen, und - wenn ein Schlüsselwort gefunden wurde - den betreffenden Link in eine neue Datei schreiben.


    Am Schluß sollte ich also zwei Dateien haben - eine Gesamtliste, und eine gekürzte Liste (je nach Schlüsselwörtern).


    Jemand ne Idee? Ich hab noch nie mit Variablen in shellscripts gearbeitet .. bin da etwas blank.

  • Na ja .. z.B. mit for-schleifen, wo man variablen definieren kann; z.b. ($i=1, $i < 20, $i++) um von 1 bis 20 durchzuzählen und in einer do-done umgebung eizufügen. Bei mir sieht das so ähnlich aus:

    Code
    1. for (( i=1; i<=10; i++ ))
    2. do
    3. wget -q -O filename$i http://link-mit-POST-angabe&page=$i
    4. done


    ich erhalte dann 10 dateien namens filename1, filename2, ... bis filename10.


    ich dachte, auf diesem weg kann ich vielleicht auch zeile für zeile die datei durchgehen, und jede zeile an ein wget übergeben. aber ich weiß nicht, ob diese variablen-möglichkeit auch über mehrere shell-programme hinausgeht. ich müßte also über ein script ein anderes programm aufrufen, mich aber immer noch im ersten programm bewegen .. äh .. so ähnlich :-)

  • Das Problem ist glaube ich, dass du sogar 3 Schritte machen müsstest, da aus Schleife A mal schnell in Schleife B springen und das Ergebnis zurück in Schleife A übernehmen gar nicht bzw. wenn nur sehr sehr mühselig geht. Man kann mit wget auch m.W. nicht in Echtzeit eine remote Datei/Webseite nach Suchbegriffen durchsuchen.


    1. Du müsstest dir also erstmal die Inhalte der URLs mit wget holen und irgendwo lokal schreiben/ablegen, sodass du dann quasi von jeder URL ne lokale HTML-Datei hast
    2. Dann die Dateien einzeln mit grep durchsuchen nach den Suchbegriffen
    3. grep hat einen Parameter, der dir erlaubt, alle Dateinamen, in denen deine Suchbegriffe vorkommen, als Liste auszugeben. Diese kannst du ja in eine Datei schreiben und hast deine getrimmte Liste (z.B. grep "lala" > ausgabe.txt). Das Problem ist dann vermutlich, dass du dann ne Liste von Dateinamen hast und keine URL mehr, hmm.


    Das ist IMO ein ziemlicher pain in the ass. Mit PHP oder irgendeiner reinen serverseitigen Sprache und cURL wäre das eine Sache von vllt. 10-15 Codezeilen. Shell is eh nicht so mein Steckenpferd, sorry.

  • Ja, ich weiß, über PHP wär das einfach wenn ich direkten Datenbankzugriff hätte ..
    nur was ich hier auslesen will (flüster) ist von ner fremden Website ;-))
    Na gut .. ich denk mal bissi drüber nach, vielleicht kommt mir bei nem Bier (oder zwei) eine Idee *g*
    Danke jedenfalls!

  • Auch mit PHP kannst du den Quellcode einer fremden Seite auslesen, entweder mit cURL oder file_get_contents()

    PHP
    1. $homepage = file_get_contents('http://www.example.com/');


    Damit hätte man in der Var $homepage den kompletten Quellcode-String der Seite, den man durchsuchen kann, und das alles innerhalb einer Schleife mit diversen URLs. Als Shellscript ist das leider recht kompliziert, wobei ich denke, ein Linux-Crack könnte einem das auch in 5-10 Minuten umsetzen. Gibt es Shell-Foren? ^^

  • Hi du kannst das auch im shellscript via grep machen:

    Code
    1. for (( i=1; i<=10; i++ ))
    2. do
    3. wget -q -O filename$i http://link-mit-POST-angabe&page=$i
    4. grep -i expression filename$1 > filename_ergebnis$1
    5. done


    Wobei expression für das Suchwort steht.
    -i stellt casesensitiv ab


    lg
    Stefan

  • Mal schnell zusammen geklöppelt:


    Das Script durchsucht die Quellcodes aller 4 URLs nach dem String "Homer" (Zeile 8 ) und gibt die URL nur dann aus, wenn im Quelltext der Suchstring vorkommt. Statt der Ausgabe der URL lässt sich diese natürlich auch in eine Datei schreiben...


    Live-Beispiel: http://docs.schloebe.de/remotefind.php

  • Wenn im File urls jeweils eine URL pro Zeile steht (und auch die letzte Zeile mit Zeilenvorschub endet):


    Code
    1. cat urls | while read URL; do wget -qO- $URL | grep -q Homer && echo $URL; done


    -O- sorgt dafür, dass wget auf stdout schreibt, bei Verknüpfung von zwei Befehlen mit && wird der zweite nur ausgeführt, wenn der erste erfolgreich war (Exit-Code 0).

  • Cooool! die cat-Zeile von chl hat mir sehr geholfen! so hab ichs jetzt auch mal gelöst.
    Der scriptablauf dauert nur relativ lang, da muss ich aufpassen, dass ich in kein timeout vom webserver laufe.


    Die Lösung über PHP werd ich aber alternativ auch anschauen .. vielleicht ist die eleganter und schneller (wobei es hier ja primär auf die Geschwindigkeit ankommt, mit der die einzelnen Webseiten vom Webserver geholt werden, und die ist bei wget und file_get_contents wahrscheinlich gleich).