Werte aus Webseite lesen

I

itworker

Grünschnabel
Wie kann ich von einer Datei die Werte zwischen zwei Begriffen:
Celsius_1:
und <br /> per bash auslesen?
In diesem Beispiel sollte der Wert 23.94 ausgegeben werden.

HTML:
<!DOCTYPE HTML>
<html>
Temperature Celsius_1:23.94<br />
</html>

Leider habe ich keinen Plan wo man da ansetzt.
 
Zuletzt bearbeitet:
html2text oder so ähnlich gibts. Google mal danach.

Gesendet von meinem HTC 10 mit Tapatalk
 
Die Daten liegen bereits als Text vor.
wget 192.168.123.192/index.php
 
Zuletzt bearbeitet:
Hilfreich für soetwas sind "grep" "egrep" "cut" oder "awk". In deinem Falle würde
Code:
egrep -o "\-?[0-9]{1,2}\.[0-9]{1,2}" index.php
genügen
 
Danke für Deine Antwort. Deinen Code habe ich verwendet.

Habe meine Lösung nun fast fertig.

  1. Arduino mit Ethernet Shield fungiert als Webserver und hat 3 Temperatursensoren.
  2. Zabbix liest per Script die Werte des 1. Sensors ein und gibt per Mail Alarm, wenn die Temperaturschwelle überschritten ist.

Code:
#!/bin/bash
content=$(wget 192.168.123.192 -q -O -)
echo $content>/tmp/content.txt
foo=($(egrep -o "\-?[0-9]{1,2}\.[0-9]{1,2}"  '/tmp/content.txt'))

#1. Temperaturert
echo ${foo[0]}
 
Zuletzt bearbeitet:
Ein bisschen sehr kompliziert, da du erst den Quelltext der Webseite mit wget in eine Variable packst. Die Variable nutzt du dann nur, um den Inhalt dieser in eine Datei zu packen (das kann wget auch mit -O /tmp/content.txt direkt). Dann machst du eine nächste Variable auf um darin das Suchergebnis zu speichern. Danach lässt du die Variable anzeigen. Falls temporäre Dateien nötig sind, diese zum Schluss wieder löschen. Es bietet sich auch an, solche kurzlebigen Dateien in den Arbeitsspeicher (dev/shm/content.txt) zu schreiben, um die Festplatte zu schonen.

Viele Wege führen nach Rom sagt man, vieles funktioniert auch auf komplizierter Art aber man sollte immer sehen, dass man es so unkompliziert wie möglich hält. Das kommt dann mit der Zeit, wenn man immer mehr Funktionen kennenlernt. So wie es bei dir aussieht, kennst du die Möglichkeit der Pipe noch nicht. Die Pipe leitet die Ausgabe vom Befehl links neben der Pipe zu den Befehl rechts neben der Pipe. Befehl1 | Befehl2

Du könntest also ganz einfach schreiben
Code:
#!/bin/bash
#1. Temperaturwert
wget 192.168.123.192 -q -O - | egrep -o "\-?[0-9]{1,2}\.[0-9]{1,2}"

Um so mehr Funktionen und "Tricks" man kennt, umso kürzer wird später das Programm/Skript.
 
Gratulation, dies ist eine schöne Idee. Für diese Webseite passt es auch richtig gut.

Trotzdem würde ich gern wissen, wie ein Wert zwischen zwei Kennern ausgelesen werden kann.
Mit einer Google Suche "Bash Substring" finde ich keine Erfolge.
 
Du kannst die Zeile mit sed durch die Zahl ersetzen:
Code:
grep "Celsius_1" <(curl -s 192.168.123.192/index.php) | sed 's/.*Celsius_1:\([[:digit:].]\+\)<br.*/\1/g'

Viele Grüße,
Pik-9
 
Zuletzt bearbeitet:
Hallo Itworker, ich hatte dir doch weitere Recherche-Begriffe mit auf dem Weg gegeben (Posting #4). Wenn du da nicht ansetzt und G**gle nicht richtig fütterst, können wir ja nichts dafür. Um so mehr Wörter man in Suchmaschinen angibt, umso besser kann auch das Suchergebnis aussehen.

"bash substring"... tja, sollte schon ein Zufall sein, wenn g**gle da eine genaue Lösung zu deinem Problem aufzeigt... Die zwei Wörter hättest du auch einen Linuxexperten gegen den Kopf schmeißen können, da wäre nicht mehr wie ein Schulterzucken bei herumgekommen.

Es gibt auch Seiten, die dir zeigen, wie man eine Suchmaschine richtig bedient. Wenn du schon auf Englisch suchst, kannst du auch ausführlicher werden, "unix bash between two chars" "linux bash between two characters" vielleicht zusätzlich mit grep egrep cut awk, was ich schon sagte. Generell sollte man mehr wie zwei Wörter angeben, G**gle nimmt auch mehr wie 10 Wörter entgegen.

Im Terminal kannst du auch Anleitungen zu Befehlen finden, du gibst einfach
Code:
man befehl1
ein. Das "man" bedeutet manual/Anleitung. Sollte alles auf Englisch sein - es gibt auch Deutsche Manualseiten, die kann man sich nachinstallieren. Wenn wget bei dir schon funktioniert, sind die Manualseiten von wget auch mitinstalliert. Gib einfach mal "man wget" ein. Beenden mit q.

Code:
ZeichenDavor=":"
ZeichenDanach="<"
SuchenInZeile="Celsius"

wget 192.168.123.192 -q -O - | grep "$SuchenInZeile" | cut -d $ZeichenDavor -f 2 | cut -d $ZeichenDanach -f 1

oder

Code:
 wget 192.168.123.192 -q -O - | grep "$SuchenInZeile" | awk -F':|<' '{ print $2 }'
Code:
 wget 192.168.123.192 -q -O - | grep "$SuchenInZeile" | awk -F''"$ZeichenDavor"'|'"$ZeichenDanach"'' '{ print $2 }'

Es gibt viele Möglichkeiten das zu lösen (siehe Suchmaschine), hier mal zwei einfache, die man doch noch halbwegs beim Lesen versteht, ich glaube, darauf kommt es dir an. Dir helfen ersteinmal keine kryptisch aussehenden Befehlsketten, du willst sehen wie was funktioniert. Auf kurz oder lang wirst du aber zu immer komplizierteren regulären Ausdrücken gelangen. Also oben mal einfache durchschaubare Befehlsketten. Die Variablen habe ich mal gesetzt, damit du den Code besser verstehst. Aber wie in diesem Thread schon zu sehen ist, kann man unter bestimmten Voraussetzungen auch anders filtern, egal welches Zeichen links oder rechts steht und dadurch den Code wesentlich kürzer gestalten.
 
Vielen Dank!

Das ist eine sehr gute Idee.
Gruss aus Sachsen
 

Ähnliche Themen

Mit bash Skript bestimmte Werte aus Tabelle lesen

ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

Werte aus Dateien lesen

suchen und ersetzen, Format erhalten

String aus Webseite extrahieren

Zurück
Oben