Wert nach einer bestimmten Zeichenkette auslesen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,
    ich habe eine lange Zeichenkette und möchte den Zahlenwert nach einem festen String ermitteln. Aber wie? Irgendwie stehe ich auf dem Schlauch.

    Delemiter bei grep (-d) und awk (-F) ist klar, aber ich möchte als "Delemiter" ja einen Textstring verwenden.

    Mittels wget:

    Code
    eature=channels4&amp;ved=CAQQmys" data-style-type="branded"><span class="yt-uix-button-content"><span class="subscribe-label" aria-label="Abonnieren">Abonnieren</span><span class="subscribed-label" aria-label="Abmelden">Abonniert</span><span class="unsubscribe-label" aria-label="Abmelden">Abmelden</span> </span></button><button class="yt-uix-button yt-uix-button-size-default yt-uix-button-default yt-uix-button-empty yt-uix-button-has-icon yt-uix-subscription-preferences-button" type="button" onclick=";return false;" aria-live="polite" aria-busy="false" aria-role="button" aria-label="Abo-Einstellungen" data-channel-external-id="UCDjcRPtmNzBJTmoVY6OmYaA"><span class="yt-uix-button-icon-wrapper"><span class="yt-uix-button-icon yt-uix-button-icon-subscription-preferences yt-sprite"></span></span></button><span class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="676" tabindex="0" aria-label="676 Abonnenten">676</span>  <span class="yt-subscription-button-disabled-mask" title=""></span>
    
    
      <div class="yt-uix-overlay "  data-overlay-style="primary" data-overlay-shape="tiny">
    
    
            <div class="yt-dialog hid " role="dialog">
        <div class="yt-dialog-base">
          <span class="yt-dialog-align"></span>

    Delemiter wäre "yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" tite" (um z.B. die Abonentenzahl zu ermitteln)

    Aber mich würde auch prinzipiel die Lösung für eine solche Aufgabenstellung interessieren, danke![/code]

    Einmal editiert, zuletzt von topsurfer (5. Januar 2015 um 23:50)

  • Ne das ist kein Delimiter..
    Grundsätzlich kann aber awk auch einen längeren String als Delimiter nutzen

    echo 1foo2 |awk -F "foo" '{print $1}'

    Hm kenne nicht was du aus lesen willst aber einen nicht gerade schöne Idee wäre dies

    Code
    echo '</span></button><span class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="[b]676[/b]"' | sed -e "s/.*\]\([0-9]\{1,\}\)\[.*/\1/"

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

  • Hallo,

    eine andere wäre, einfach mit grep aus der Homepage die entsprechende Zeile zu finden, und dann z.B die Klammern um das b als Delimiter zu nehmen:

    Code
    ... | grep subscriber-count | cut -d "]" -f2 | cut -d "[" -f1
  • Code
    echo '</span></button><span class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="[b]676[/b]"' | sed -e "s/.*\]\([0-9]\{1,\}\)\[.*/\1/"
    Code
    ... | grep subscriber-count | cut -d "]" -f2 | cut -d "[" -f1

    Ich glaube die [b] usw waren falsch gesetzt von ihm :D ich glaub er wollte zeigen welchen Wert er haben möchte, ohne zu wissen das BOLD nicht im CODE tagg funktioniert :fies:

    Also Jungs, passt eure Befehle noch mal an und ignoriert die BOLD taggs :D (die würden in HTML so eh kein Sinn ergeben)


    Code
    .... .... .....></span></button><span class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="676" tabi............................

    Es wäre aber gut zu wissen wie die komplette Zeile aussieht.

  • Oh, das stimmt wohl.

    Falls in der Zeile sonst keine Zahlen vorkommen:

    Code
    ... | grep subscriber-count | tr -cd 0-9

    Du hast auch nach einer allgemeinen Lösung für solche Dinge gefragt:

    Eine allgemeine Lösung für solche Aufgabenstellungen gibts nicht. Sowas läuft zumindest in der Shell meistens auf Urgesteine wie sed, grep, awk, tr, cut usw. hinaus.
    Höhere Programmiersprachen besitzen i.d.R verschiedene Methoden für solche Dinge.

  • Hallo,
    die Zeile ist wirklich lang, besitzt auch an anderen Stellen Zahlen etc.
    Daher mein "Hinweise", das der notwendige "Delemiter" der oben genannte (eindeutige) String sind müßte, grep nach Zahl oder oder eckigen Klammern oder nach drei Zahlen hintereinander in der Zeile bringt kein Erfolg!

    Gibt es nicht so was wie beim grep (cat Textfile | grep -A <ZeilenVorwärts> <Suchstring>) ?
    also such den String xxxxx und gib dann die anschliessenden 10 Zeichen aus (die dann weiterverarbeitet werden können um die zahl rauszufiltern) ...

    PS: Ja, die [b im Beispiel sollten BOLD darstellen um zu zeigen, das diese Zahl gesucht wird

    Einmal editiert, zuletzt von topsurfer (5. Januar 2015 um 23:11)

  • Zeig doch mal den entsprechenden HTML-Ausschnitt. Am besten verlinkst die ganze Homepage, die du da auswertest.

    • Offizieller Beitrag
    Code
    a = """</span></button><span class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="676" """
    zahl = a.split("yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip")[1].split("title=")[1]

    Wäre in Beispiel für python ohne regexp.
    grep kann doch auch regexp, oder? Wäre ein weiter ansatz wenn es unbedingt Bash sein muss.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (5. Januar 2015 um 23:19)


  • grep nach [...] oder eckigen Klammern

    Das war auch eine Fehlerinterpretation, da du oben im Code einen Fettdruck eingesetzt hast und die Jungs das hier engstirnig beachtet haben.

    Deshalb mein Hinweis an Dich die Zeile unverändert, ohne etwas deinerseits zu markieren, roh, noch mal zu posten damit man dir auch vernünftig/besser helfen kann.

  • Code
    knoppix@Microknoppix:~$ str='</span></button><span class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="676" '
    knoppix@Microknoppix:~$ pattern='*class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="'
    knoppix@Microknoppix:~$ echo ${str##$pattern} | grep -o '^[0-9]*'
    676

    Es geht sogar ohne grep:

    Code
    knoppix@Microknoppix:~$ pattern='*class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="'
    knoppix@Microknoppix:~$ terminator='"*'
    knoppix@Microknoppix:~$ str='</span></button><span class="yt-subscription-button-subscriber-count-branded-horizontal yt-uix-tooltip" title="676" '
    knoppix@Microknoppix:~$ tail=${str##$pattern}
    knoppix@Microknoppix:~$ echo ${tail%%$terminator}
    676

    Einmal editiert, zuletzt von Tell (5. Januar 2015 um 23:52)


  • Gibt es nicht so was wie beim grep (cat Textfile | grep -A <ZeilenVorwärts> <Suchstring>) ?
    also such den String xxxxx und gib dann die anschliessenden 10 Zeichen aus (die dann weiterverarbeitet werden können um die zahl rauszufiltern) ...


    Das kann man z.B so machen:

    Code
    julian@Lenovo:~$ echo "Ich bin ein String 123456" | grep -o -P 'String.{0,5}'
    String 1234
  • Hallo,
    habe den Code oben mal korrigiert und paar mehr Zeilen eingetragen.

    Meine Lösung jetzt:

    #cat Textfile | awk -F "aria-label=\"[0-9]* Abonnenten\">" '{ print $2 }' | cut -c1-7 | grep -v "^$" | cut -d"<" -f1
    676

  • Hi,

    In diesem Fall bekommst du das sehr schön mit grep -o in Kombination mit einem Regulären Ausdruck hin. :)

    Code
    $ cat teststring.txt | grep -o "[0-9]* Abonnenten"
    676 Abonnenten


    Oder

    Code
    $ cat teststring.txt | grep -o "[[:digit:]]* Abonnenten"
    676 Abonnenten

    Durch die Option -e wird nur das Muster zurückgegeben nachdem gesucht wird.
    Der Reguläre Ausdruck [0-9]* bzw. [[:digit:]]* steht für eine beliebige Anzahl von Zahlen. Oder einfacher gesagt: eine beliebig große (Ganz)Zahl.
    Im ubuntuusers.de Wiki gibts zum grep einen sehr guten Artikel <--Klick-->

    ---------
    Anhand der CSS Klassennamen würde ich mal auf Youtube tippen. :stumm: :D
    Falls ja würd ich mir die Anzahl der Abonennten vielleicht eher über die offizielle API holen anstatt den Quelltext der Seite zu parsen.?

    DON'T PANIC!

    Einmal editiert, zuletzt von joh.raspi (6. Januar 2015 um 03:09)

  • Zitat

    ...
    Anhand der CSS Klassennamen würde ich mal auf Youtube tippen. :stumm: :D
    Falls ja würd ich mir die Anzahl der Abonennten vielleicht eher über die offizielle API holen anstatt den Quelltext der Seite zu parsen.?


    YT, gut analysiert ;)
    Läßt sich die API auch aus der Shell nutzen und die Abo-Zahl schneller und effektiver ermitteln?
    Würde ungern wegen einem "Anwendungsfall" was anderes als "einfache" Shellscripte verwenden ..,..

    Einmal editiert, zuletzt von topsurfer (6. Januar 2015 um 09:07)

  • Code
    $ cat teststring.txt | grep -o "[0-9]* Abonnenten"
    676 Abonnenten


    Oder

    Code
    $ cat teststring.txt | grep -o "[[:digit:]]* Abonnenten"
    676 Abonnenten

    Lass mal noch cat weg :fies:

    Code
    $ grep -o "[0-9]* Abonnenten" teststring.txt
    676 Abonnenten
  • Hatte das cat gestern gedanklich schon durch curl ersetzt und daher gar nicht mehr so weit gedacht. :D

    Vorgestellt hab ich mar das ganze so:

    Code
    curl -s link | grep -o "[0-9]* Abonennten" | cut -d" " -f1

    topsurfer Das weiß ich nicht. Lässt sich aber bestimmt über einer Suche herausfinden ;)
    War eigentlich nur so ein Gedanke.

    DON'T PANIC!

    Einmal editiert, zuletzt von joh.raspi (6. Januar 2015 um 17:57)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!