Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: Mir war langweilig: urlgrep in bash.

  1. #1
    Gentoo User Avatar von lfhelper
    Registriert seit
    Jan 2006
    Ort
    Stuttgart
    Beiträge
    129

    Mir war langweilig: urlgrep in bash.

    Hi all,

    ich wollte nur mal kurz ein script sharen.

    urlgrep:
    Code:
    #!/bin/sh
    
    while [[ $# -gt 0 ]]; do
        case $1 in
            #allows to give custom html sourcecode retrieving command
            "-c") shift; htmlcommand=$1;;
            #may help to find "inner" urls in urls by recursive scanning
            "-r") recursive="true";;
            #scans the complete document for urls patterns, not just
            #in between the html-tags like href=* ...
            "-t") textscan="true";;
            #allows to grep for regex
            "-regex") shift; regex=$1;;
            #allows to grep for case-insensitive regex
            "-iregex") shift; iregex=$1;;
            *) URLV="$1 $URLV";;
        esac
        shift
    done
    
    word="([^ <>\"\']|[:tab:])"
    dword="([^ <>\"\'/]|[:tab:])"
    
    if [[ -z "$htmlcommand" ]]; then
        #default html get command
        htmlcommand="links -source"
        #and some alternatives
    #   htmlcommand="curl -o -"
    #   htmlcommand="w3c -n"
    #   htmlcommand="w3m -dump_source"
    fi
    
    function make_absolute {
        STRING=$1
        while (echo "$STRING" | grep -q -E "(^|/)\.\./"); do
            STRING=$(echo "$STRING" | sed -r "s;[^/]+/\.\./;;g" | sed "s;^/\.\./;/;g")
        done
        (echo "$STRING" | grep -q -E "^((\.\.)?/|(ftp|https?)://)") &&
        echo "$STRING" || echo "$STRING" | sed -r "s;^;"$root""$path"/;g"
    }
    
    function _settify {
        while read line; do
            MD5=$(echo "$line" | md5sum | awk '{print $1}')
    
            echo "$MD5ALL" | grep -q "$MD5"
            retval=$?
    
            if [[ $retval -gt 0 ]]; then
                MD5ALL=$(echo "$MD5ALL"; echo -n "$MD5")
                echo "$line"
            fi
        done
    }
    
    function _main {
        URL=$1
        root=$(echo "$URL" | sed -r "s;^((ftp|https?)://($dword+\.)+$dword+)/.*$;\1;g")
        HTML=$($htmlcommand "$URL" || exit 1)
        domain=$(echo "$root" | grep -o -E "[^\.]+\.[^\.]+$")
        path=$(echo "$URL" | grep -o -E "/[^/].*/" | sed -r "s;^/[^/]+;;g")
        file=$(echo "$URL" | grep -o -E "[^/]/[^/]+$" | sed -r "s;[^/]/([^/]+);\1;g")
    
        urls=$(echo "$urls"; echo "$HTML" | grep -o -E "(href|src)=[\"\']?$word+[\"\']?" | sed -r "s/^(href|src)=[\"\']?($word+)[\"\']?/\2/g" | grep -v "^mailto:")
    
        if [[ -n "$textscan" ]]; then
            urls=$(echo "$urls"; echo "$HTML" | grep -o -E "(ftp|https?)://($word+(:$word+)?@)?($word+\.)+$word+(/$word*)*" | grep -v "^mailto:")
        fi
    
        urls=$(echo "$urls" | sed "s;^/;"$root"/;g" | while read line; do make_absolute "$line"; done)
    
        if [[ -n "$recursive" ]]; then
            urls=$(echo "$urls" | grep -o "[^?&]*" | grep -o -E "(ftp|https?)://($word+(:$word+)?@)?($word+\.)+$word+(/$word*)*")
        fi
    
        if [[ -n "$regex" ]]; then
            urls=$(echo "$urls" | grep -E "$regex")
        fi
    
        if [[ -n "$iregex" ]]; then
            urls=$(echo "$urls" | grep -i -E "$iregex")
        fi
    
        echo "$urls" | sed "s;/$;;g" | sed "/^$/d"
    }
    
    for URL in $URLV; do
        _main "$URL" | _settify
    done
    
    exit $?
    Usage:
    urlgrep http://www.heise.de

    Näher gehe ich nicht darauf ein, da der Name selbsterklärend ist. Have Fun.

    Gruss,
    lfhelper.

    EDIT: Update1.
    EDIT: Update2.
    EDIT: Update3.
    EDIT: Update4.
    EDIT: Update5.
    EDIT: Update6.
    EDIT: Update7.
    EDIT: Update8.
    EDIT: Update9.
    Geändert von lfhelper (28.03.07 um 16:12 Uhr)
    Gentoo 2006.1, glibc 2.4-r4, gcc-4.1.1-r1, 2.6.18-gentoo-r4, bash-3.1_p17.

  2. #2
    Noch nicht aktiviert. Avatar von Stephanw
    Registriert seit
    Oct 2004
    Ort
    ~ #
    Beiträge
    1.590
    Witziges Tool...

    Vielen Dank dafür!

    Gruß Stephan
    Fehler 400: Die Echtheitsüberprüfung von Stephanw ist fehlgeschlagen. Das KnowHow wurde auf "Grundkenntnisse" begrenzt.

  3. #3
    Gentoo User Avatar von lfhelper
    Registriert seit
    Jan 2006
    Ort
    Stuttgart
    Beiträge
    129
    Zitat Zitat von Stephanw Beitrag anzeigen
    Witziges Tool...

    Vielen Dank dafür!

    Gruß Stephan
    Wenn du das witzig findest freut es mich.
    Als Dankeschön hast du die neueste Version als Update gepostet.
    (bessere defaults usw...)

    Gruss,
    lfhelper.
    Gentoo 2006.1, glibc 2.4-r4, gcc-4.1.1-r1, 2.6.18-gentoo-r4, bash-3.1_p17.

  4. #4
    Gentoo User Avatar von lfhelper
    Registriert seit
    Jan 2006
    Ort
    Stuttgart
    Beiträge
    129
    Habe das Script übers Wochenende verbessert.
    Kann jetzt relative Links zu Absoluten umwandeln,
    aber dafür kann es nur noch direkt von URLs lesen,
    nicht mehr von Dateien oder stdin, weil ja sonst
    Informationen wie root, aktuelles Verzeichnis, Domaine usw.
    verloren gehen.

    Die aktuelle Version eignet sich geradezu perfekt als "Backend" für eine ganze Reihe weiterer (spezialisierter) Scripte.

    Have Fun.
    Geändert von lfhelper (26.03.07 um 11:58 Uhr)
    Gentoo 2006.1, glibc 2.4-r4, gcc-4.1.1-r1, 2.6.18-gentoo-r4, bash-3.1_p17.

  5. #5
    mv me /dev/null Avatar von Hakke
    Registriert seit
    Jan 2005
    Ort
    127.0.0.1
    Beiträge
    114
    Zitat Zitat von lfhelper Beitrag anzeigen
    Näher gehe ich nicht darauf ein, da der Name selbsterklärend ist. Have Fun.
    Moin..

    darf ein unbedarfter Mausschubser dennoch fragen, was das Teil macht? Nein, ich werds nicht einfach ausprobieren. Aber vielleicht tut es ja was interessantes, was ich nur noch nicht verstehe

    LG&thx
    ~~ ich bin, denke ich ~~
    KUbuntu @1GHz 512 RAM

  6. #6
    Linuxgeiler Mod Avatar von AceTheFace
    Registriert seit
    Mar 2003
    Ort
    Ulm
    Beiträge
    4.545
    Zitat Zitat von Hakke Beitrag anzeigen
    Moin..

    darf ein unbedarfter Mausschubser dennoch fragen, was das Teil macht? Nein, ich werds nicht einfach ausprobieren. Aber vielleicht tut es ja was interessantes, was ich nur noch nicht verstehe
    Es filtert einfach alle Urls, die in einer Seite vorkommen heraus und gibt sie aus. Zumindest habe ich das so verstanden. *g*
    urlgrep halt

    Gruß,
    Ace

    openSUSE 10.3 @ AMD 64 3700+,A8N-SLI-Premium,1GB,256MB NVIDIA GeForce 7950GT
    Mac OS X Tiger @ MacBook, Intel Core Duo 2GHz, 2GB

    Last.FM - Profil | Blog


  7. #7
    Gentoo User Avatar von lfhelper
    Registriert seit
    Jan 2006
    Ort
    Stuttgart
    Beiträge
    129
    @Hakke

    Ja, es gibt dir alle gefundenen URLs aus.

    $ urlgrep http://www.pro-linux.de

    Zum Beispiel.

    Das "besondere" an dem Script ist, dass ich mir die Mühe gemacht habe so Sachen wie die Konvertierung von relativen Links zu Absoluten in bash zu implementieren,
    sodass man keine zusätzlichen Programme oder Libs oder Perlmodule oder sonstwas dazu braucht, weil es intern nur grep, sed usw. benutzt.
    Und das ist ja schliesslich in jedem Linux vorhanden (i.d.R. ...).

    Gruss,
    lfhelper.
    Gentoo 2006.1, glibc 2.4-r4, gcc-4.1.1-r1, 2.6.18-gentoo-r4, bash-3.1_p17.

  8. #8
    Linuxgeiler Mod Avatar von AceTheFace
    Registriert seit
    Mar 2003
    Ort
    Ulm
    Beiträge
    4.545
    Zitat Zitat von lfhelper Beitrag anzeigen
    Das "besondere" an dem Script ist, dass ich mir die Mühe gemacht habe so Sachen wie die Konvertierung von relativen Links zu Absoluten in bash zu implementieren,
    sodass man keine zusätzlichen Programme oder Libs oder Perlmodule oder sonstwas dazu braucht, weil es intern nur grep, sed usw. benutzt.
    Und das ist ja schliesslich in jedem Linux vorhanden (i.d.R. ...).
    Dafür musste ich erst links nachträglich installieren

    Gruß,
    Ace

    openSUSE 10.3 @ AMD 64 3700+,A8N-SLI-Premium,1GB,256MB NVIDIA GeForce 7950GT
    Mac OS X Tiger @ MacBook, Intel Core Duo 2GHz, 2GB

    Last.FM - Profil | Blog


  9. #9
    Gentoo User Avatar von lfhelper
    Registriert seit
    Jan 2006
    Ort
    Stuttgart
    Beiträge
    129
    @oben

    Nein, das stimmt nicht ganz.

    Ich benutze in meinem Programm links nur als default.
    Wenn du dir das Script genauer anschaust, siehst du es gibt eine Option
    zum mitliefern eines eigenen HTML-Retrieve Kommandos "-c".

    Wenn du zum Beispiel kein Links aber curl oder wget oder sonstwas installiert hast,
    kannst du mit ...

    $ urlgrep -c "wget -O -" http://www.bla.com

    ... einen beliebigen Befehl zum Übertragen des HTML-Codes wählen.

    Gruss,
    lfhelper.

    PS: Oder einfach "hardcodieren" -> editor -> links -source durch was anderes ersetzen.
    Gentoo 2006.1, glibc 2.4-r4, gcc-4.1.1-r1, 2.6.18-gentoo-r4, bash-3.1_p17.

  10. #10
    Linuxgeiler Mod Avatar von AceTheFace
    Registriert seit
    Mar 2003
    Ort
    Ulm
    Beiträge
    4.545
    Ok, das hatte ich wirklich übersehen. Aber wget per default wäre wahrscheinlich hübscher weil wohl auch fast überall standardmässig mit installiert.

    Gruß,
    Ace

    openSUSE 10.3 @ AMD 64 3700+,A8N-SLI-Premium,1GB,256MB NVIDIA GeForce 7950GT
    Mac OS X Tiger @ MacBook, Intel Core Duo 2GHz, 2GB

    Last.FM - Profil | Blog


  11. #11
    mv me /dev/null Avatar von Hakke
    Registriert seit
    Jan 2005
    Ort
    127.0.0.1
    Beiträge
    114
    Danke, klingt nett.
    Wenn ich das richtig seh, könnt ich das Teil sogar produktiv brauchen..

    LG
    ~~ ich bin, denke ich ~~
    KUbuntu @1GHz 512 RAM

  12. #12
    Gentoo User Avatar von lfhelper
    Registriert seit
    Jan 2006
    Ort
    Stuttgart
    Beiträge
    129
    Ok hallo nochmal. Das Script ist jetzt ne _ganze_ Ecke reifer finde ich.

    Hat eigentlich niemand was auszusetzen?
    Irgendwelche Fälle (Seiten) wo nicht alle Links erfasst werden oder so?
    Gentoo 2006.1, glibc 2.4-r4, gcc-4.1.1-r1, 2.6.18-gentoo-r4, bash-3.1_p17.

  13. #13
    Gentoo User Avatar von lfhelper
    Registriert seit
    Jan 2006
    Ort
    Stuttgart
    Beiträge
    129
    Nochmal ne neue Version.

    Schneller, besser, krasser.

    Diesmal könnt ihr mit -regex nach perlregex greppen oder mit -iregex dasselbe case-insensitive.

    Zudem unterstützt die neue Version die Angabe mehrerer URLS über die Kommandozeile, statt wie bis Update8 nur eine (das ermöglicht ein Zusammenspiel mit xargs).

    Darüberhinaus gibts nen ordentlichen Performanceboost, weil ich quasi "uniq" selber implementiert habe. Das bedeutet ich kann auf das "sort" älterer Versionen (kleiner als Update9) verzichten, was irgendwie den Flaschenhals dargestellt hat.

    Erkannte URLS werden nun auch sofort auf die Konsole ausgegeben, statt erst komplett am Ende der Verarbeitung (was irgendwie doof ist, weil Zeit verloren geht und man die Ausgabe in der Zwischenzeit schon mal pavuk oder wget oder so übergeben könnte...).

    Viel Spass und schönen Gruss,
    lfhelper.

    PS: Hat denn wirklich niemand was auszusetzen oder Verbesserungsvorschläge? Kann man vielleicht noch Prozesse sparen durch geschickteres Kombinieren der Pipes? Sagt mal jemand was dazu!
    Gentoo 2006.1, glibc 2.4-r4, gcc-4.1.1-r1, 2.6.18-gentoo-r4, bash-3.1_p17.

  14. #14
    komplett "ausgebleicht" Avatar von Der Gestreifte
    Registriert seit
    May 2003
    Ort
    904**
    Beiträge
    3.247
    Hat denn wirklich niemand was auszusetzen oder Verbesserungsvorschläge?
    Zehn Zeilen python nehmen ;o)
    Du könntest abfragen, welcher der "htmlcommands" vorhanden ist und den (erst)besten nehmen, statt es dem User zu überlassen, das Skript anzupassen bzw im Skript nach einer Kommandozeilenoption zu suchen.
    Die Kommentare in der ersten while-Schleife würde ich in eine "-h"/"--help"/usage-Funktion packen, damit auch der unbedarfte User bei eventueller Fehlbedienung etwas davon hat.

    Kann man vielleicht noch Prozesse sparen durch geschickteres Kombinieren der Pipes?
    Statt der sed könntest Du, so weit es geht, die Bash-eigene Ersetzung nehmen.
    Ob das allerdings so der performance-boost ist, ist ne andere Frage.

  15. #15
    Registrierter Benutzer
    Registriert seit
    Apr 2018
    Beiträge
    1
    Hallo zusammen,

    alt, ich weiss Uralt aber ... allerdings
    >grep: die Syntax für Zeichenklassen ist [[:space:]], nicht [:space:]
    diese Fehlermeldung scheint dazu zufuehren das keine Urls gefiltert werden. :-(

    Irgend welche Hinweise?

    vielen Dank und schoenen Rest-Oster-Montag

    Ulli

Ähnliche Themen

  1. Wie ich zum Glauben zurückgefunden habe
    Von dobbienodoubt im Forum Meldungen und Mitglieder
    Antworten: 213
    Letzter Beitrag: 03.04.05, 20:09
  2. Cooles Tool für die *Konsoleros* ;)
    Von HangLoose im Forum Neue Programme/Versionen
    Antworten: 48
    Letzter Beitrag: 20.04.04, 18:44
  3. Wichtig nvidia anleitungen klappen bei mir nicht bitte um hilfe
    Von dsplauen im Forum System installieren und konfigurieren
    Antworten: 60
    Letzter Beitrag: 24.03.04, 18:48
  4. Wer/was ersetzt mir Outlook + Office ???
    Von praetor im Forum Anwendungen Allgemein, Software
    Antworten: 12
    Letzter Beitrag: 24.08.02, 15:16
  5. Problem mit alsa bei der SDL-Compilierung!
    Von -Hendrik- im Forum Musik
    Antworten: 4
    Letzter Beitrag: 20.08.02, 21:10

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •