Shell: Datei nach generischen String durchsuchen

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
Hallo,

ich suche gerade nach einer Möglichkeit, eine Datei aus dem "Web" zu laden, diese nach einem generischem String (URL mit wechselndem Key) zu durchsuchen.

Das ganze ist eine JSP Seite die z.B. folgende Ausgabe enthält:
HTML:
<tr>
    <td class="small">
        mandant-1<br />mandant-2
    </td>
    <td class="small">Cache 1018787659
    </td>
    <td class="small">50000</td>
    <td class="small">180</td>
    <td class="small">159</td>
    <td class="small"><a
            href="?refresh=1018787659">Refresh</a></td>
    <td class="small"><a
            href="?nuke=1018787659">Nuke</a></td>
    <td class=small>
        <form action="" method="post">
            <input type="hidden" name="accessor" value="1018787659" />
            modelgroup-changed=<input type="text" name="modelgroup-to-change" />
        </form>
    </td>
</tr>

Interessant für mich ist nun der Key: 1018787659
Dieser Block kommt jedoch mehrfach vor. Mit unterschiedlichen Mandanten.Mandanten sind eindeutig.
Der Key wechselt mit jedem Reload.

Sieht jemand eine möglichkeit mit einem shellscript sowas zu lösen? das herunterladen ist kein Problem ...
 
Du willst aber schon für jeden Mandanten diese Zahl haben? Dann probiere es mal mit
Code:
curl --silent deineUrl | grep -Pio "(?<=accessor\" value=\")\d+"
Könnte man noch etwas stabiler gestalten, aber reicht dir vermutlich schon.

Edit: auf den ersten Blick gar nicht gesehen, dass die Zahl mehrfach vorkommt. Stört nicht, ermöglicht aber eine noch einfachere regexp. Egal. ;)
 
Zuletzt bearbeitet:
nein, ich möchte nur für einen mandanten den eintrag raus haben. mit perl habe ich nun folgendes:

code:
Code:
#!/usr/bin/perl -w

use strict;

open (my $IN,"<test.jsp") || die "can not open datei: $!";
print grep /mandant-1|value/i, <$IN>;
close $IN;

ergebnis:
Code:
                                <input type="hidden" name="accessor" value="1643182421" />
                                <input type="hidden" name="accessor" value="1610350941" />
                                <input type="hidden" name="accessor" value="391299502" />
                                <input type="hidden" name="accessor" value="1336338484" />
                                <input type="hidden" name="accessor" value="1584610650" />
                                <input type="hidden" name="accessor" value="880065148" />
                                <input type="hidden" name="accessor" value="529509774" />
                                mandant-1<br />mandant-2
                                <input type="hidden" name="accessor" value="466585862" />
                                <input type="hidden" name="accessor" value="1653273125" />
                                <input type="hidden" name="accessor" value="752523042" />
                                <input type="hidden" name="accessor" value="1203490231" />
                                <input type="hidden" name="accessor" value="1593248492" />
                                <input type="hidden" name="accessor" value="1183880673" />
                                <input type="hidden" name="accessor" value="1597502912" />
                                <input type="hidden" name="accessor" value="161252006" />

Damit kann ich aber jetzt wenig anfangen, da alle Keys drin stehen - ich brauche halt nur den einen für mandant-1<br />mandant-2
 
Sowas?

Code:
curl --silent $url | sed -n '/mandant-1<br \/>mandant-2/{n;n;n;n;n;n;n;n;n;n;n;n;n;s/[^0-9]*//g;p;q;}'

Bei dem curl Teil hab ich mich jetzt mal auf Tumbleweed verlassen. Hoffentlich fällt jemanden noch ein wie man die 13 n; kürzen kann^^

Edit: So ist es zwar nicht kürzer, aber schicker und dynamischer

Code:
sed -n '/mandant-1<br \/>mandant-2/{
:loop
n
s/value//
T loop
s/[^0-9]*//g
p
q
}' dat
 
Zuletzt bearbeitet:
wow! besten dank, funktioniert wunderbar - gibt es dazu vielleicht noch eine erklärung? würde das gerne nachvollziehen um beim nächsten mal nicht wieder so "dumm" aus der wäsche zu gucken
 
Jup gern
Zeile
1 sucht Zeilen in denen das Pattern "mandant-1<br />mandant-2" vorkommt und führt dort die Befehle in {} aus
2 Label loop
3 nächste Zeile des Inputs einlesen
4 sucht in der aktuellen Zeile nach "value" (und löscht es aber das is hier eigentlich irrelevant)
5 springt zum Label loop wenn das s/value// nichts gefunden hat
Bis hierher wird praktisch in einer Schleife die erste Zeile nach "mandant-1<br />mandant-2" gesucht in der "value" vorkommt.
Wenn es hier weiter geht ist eine Zeile mit "value" gefunden.
6 löscht in der aktuellen Zeile alle Zeichen die keine Ziffer sind
7 gibt aus was noch übrig ist (das sollte jetzt der gewünschte Key sein)
8 beendet das Script, da du ja eh nur den ersten Mandanten haben willst (oder kann der auch mehrfach vorkommen?). Ist also eigentlich nur ne Effizienzsache.

Ich hoffe es ist einigermaßen klar geworden. Kannst gerne nachfragen wenn noch was unklar ist. Bin aber auch noch nicht so der sed Experte, da ich bisher eigentlich ziemlich viel mit awk gemacht hab. Zwinge mich aber aktuell ein bisschen zu sed^^ weils auch ziemlich cool ist.
 
Zuletzt bearbeitet:
Zurück
Oben