Jump to content

Linux grep Experten gesucht


Empfohlene Beiträge

Hallo, ich möchte eine weather.json nach den Werten von humidity durchsuchen und in eine Datei schreiben.

Diese sind immer

- in der selben Zeile wie das Wort "humidity" UND

- zweistellige, ganze Zahlen ODER

- 0 ODER

- leer ("")

Wenn "" gefunden wird soll gern auch eine 0 dafür geschrieben werden.

 

Die zweistelligen, ganzen Zahlen finde ich :) Immerhin. Mit

 

wget 192.168.178.197/weather.json -q -O - | grep -A0 "humidity" | grep -o "[0-9][0-9]"

-> Oder geht das noch besser???

 

Aber die anderen beiden "Suchvorgaben mit Umwandlung "" in 0" bekomme ich nicht hin... :( 

Wichtig wäre auch, dass DIE REIHENFOLGE der Sensoren beibehalten wird.

 

Kann mir jemand einen Tipp geben? DANKESCHÖN :blink:

 

 

Spoiler

{
  "chhead": "7",
  "channel0": {
    "temperature": "23.4",
    "humidity": "0"    
  },
  "channel1": {
    "temperature": "20.8",
    "humidity": "40"
  },
  "channel2": {
    "temperature": "20.6",
    "humidity": "42"
  },
  "channel3": {
    "temperature": "8.2",
    "humidity": "72"
  },
  "channel4": {
    "temperature": "10.3",
    "humidity": "65"
  },
  "channel5": {
    "temperature": "20.7",
    "humidity": "43"
  },
  "channel6": {
    "temperature": "23.3",
    "humidity": "43"
  },
  "channel7": {
    "temperature": "4.1",
    "humidity": "81"
  },
  "channel8": {
    "temperature": "",
    "humidity": ""
  },
  "channel9": {
    "temperature": "22.8",
    "humidity": "40"
  },
  "channel10": {
    "temperature": "",
    "humidity": ""
  },
  "channel11": {
    "temperature": "5.0",
    "humidity": "81",
    "weather id": "800"
  }
}

 

 

bearbeitet von Gandalf
Bitte Spoiler-Tag's verwenden, Danke!
Link zum Beitrag
Auf anderen Seiten teilen
  • Admin

@dboxulle

 

Allein mit "grep" geht das nicht, mit ein paar extra Kommandos aber schon:

wget -q -O- http://192.168.178.197/weather.json | grep humidity | cut -d'"' -f4 | sed s/^$/0/g

 

Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)

Kurze Rückmeldung: Läuft genau wie erwartet :) Danke!

 

Und eine Nachfrage: Ich will die Werte in eine Datei schreiben mit

>> luftfeuchtigkeit.log

 

Die Werte stehen dann alle pro Wert = 1 Zeile untereinander.

 

Ist das zur späteren Auswertung sinnvoll?

Oder wäre es besser, pro Auslesen eine Zeile mit allen Werten getrennt durch Komma, Semikolon oder Doppelpunkt zu erzeugen?

 

Wenn ja : Wie macht man das beim in die Datei schreiben? :blink:

 

Danke euch fürs Helfen ^_^

bearbeitet von dboxulle
Link zum Beitrag
Auf anderen Seiten teilen
  • Admin

Auch das geht relativ einfach:

 

line=`wget -q -O- http://192.168.178.197/weather.json | grep humidity | cut -d'"' -f4 | sed -e s/^$/0/g -e s/$/";"/g`
echo `date +"%Y/%m/%d %H:%M:%S"`\; $line >> luftfeuchtigkeit.csv

 

Jeder Aufruf erzeugt eine neue Zeile mit Zeitstempel in der CSV-Datei. Vor dem Dateinamen "luftfeuchtigkeit.csv" besser noch einen Pfad angeben, da die Datei sonst einfach im aktuellen Verzeichnis erzeugt wird, in der das Script läuft. Also z.B.  "/var/logs/luftfeuchtigkeit.csv".

 

Wenn Du noch Überschriften in die CSV-Datei einfügen willst, kannst Du das beim  ersten Anlegen machen. Aber Vorsicht: alle bisherigen Inhalte der Datei werden dabei gelöscht. Ist die Datei noch nicht vorhanden, wird sie automatisch angelegt.

 

line=`wget -q -O- http://192.168.178.197/weather.json | grep channel | cut -d'"' -f2 | sed s/$/";"/g`
echo Time\; $line > luftfeuchtigkeit.csv

 

Edit: Eine Anmerkung noch: Was aussieht wie einfache Hochkommas um die Befehle sind keine. Das ist wichtig! Das erforderliche Zeichen erhältst Du, wenn Du die Umschalttaste und die Taste schräg rechts über dem "Ü" auf der Tastatur gleichzeitig drückst und anschließend die Leertaste. Bissl umständlich, aber Du kannst die einzelnen Zeilen ja aus dem Posting kopieren. Da hast Du gleich die richtigen Zeichen. Aber aufpassen, wenn Du das unter Windows machst. Die Zeilenenden wären dann falsch (CR+LF statt nur LF) unnd würden zu einem Syntaxfehler führen. Also die Zeilen besser einzeln ohne Zeilenende kopieren.

 

 

Link zum Beitrag
Auf anderen Seiten teilen

Hello again ^_^

 

Ich komme nicht weiter, da ich das Projekt vermutlich falsch angegangen bin :(

 

Mein Plan war, aus der JSON eine Log Datei zu erstellen, welche man dann einfach schön visualisieren kann (Verlauf der Temperaturen und Luftfeuchtigkeit von 4 ausgewählten Sensoren)

 

Aber nach langer Recherche geht das so wohl nicht (mit meiner Log Datei und die dann auslesen und mit Highcharts, Grafana, usw. zu visualisieren)...

 

Laut Recherche muss man die Werte erst in eine Datenbank schreiben?

influx, RRDtool, SQL, SQLlite, NOSQL,... 

 

Geht das nicht anderes ? :ph34r: Habt ihr da eine Idee zu?

 

Mir raucht schon der Kappe von den ganzen Möglichkeiten aber ich weiß nicht, mit welcher man es am klügsten umsetzt :blink:

 

Danke vorab mal wieder :excl:

Link zum Beitrag
Auf anderen Seiten teilen
  • Admin

Du kannst die erzeugte CSV-Datei einfach in Excel oder Calc von Open-Office einlesen und den importierten Datenbereich in einer Grafi anzeigen lassen.

Ansonsten sollte eigentlich jedes normale Datenbankprogramm CSV-Daten importieren können.

Allerdings stellen alle unterschiedliche Anforderungen an das Format. Die einen wollen Semikolons als Trennzeichen und Kommas als Dezimalzeichen, andere Komma als Trennzeichen und Punkt als Dezimalzeichen. Das hängt von den Spracheinstellungen ab. Auch daß die erzeugte Datei nur das LF-Zeichen am Zeilenende hat, verstehen einige Programme nicht und erwarten CR+LF. Das hängt davon ab, ob sie unter Linux oder Windows laufen.

Wenn Du also den Code für einen neuen Zeileneintrag zyklisch aufrufst, solltest Du eine voll verwendungsfähige Datendatei erhalten.

Link zum Beitrag
Auf anderen Seiten teilen

Danke dir Snowhead :)

 

Da ich die Graphen mit einem Tablet anrufen möchte, werde ich sie wohl mit deinem grep und Cronjob zerpflücken und in RRDtool schreiben.

 

Könntest Du nochmals diesen Befehl prüfen:

line=`wget -q -O- http://192.168.178.197/weather.json | grep humidity | cut -d'"' -f4 | sed -e s/^$/0/g -e s/$/";"/g`
echo `date +"%Y/%m/%d %H:%M:%S"`\; $line >> luftfeuchtigkeit.csv

Ich habe ihn 3 mal händisch abgetippt und auch in Notepad++ kopiert und in UTF8 umgewandelt aber er

schreibt immer nur das Datum und die Uhrzeit in die .CSV :blink:

 

Danke nochmals!

Link zum Beitrag
Auf anderen Seiten teilen
  • Admin

Das heißt, daß in der Variablen "line" nichts ankommt. Was wird denn ausgegeben, wenn Du die reine Befehlszeile auf der Kommandozeile ausführst?

wget -q -O- http://192.168.178.197/weather.json | grep humidity | cut -d'"' -f4 | sed -e s/^$/0/g -e s/$/";"/g

 

Link zum Beitrag
Auf anderen Seiten teilen

0;
38;
39;
78;
75;
.

.

.

 

usw. 

 

Das klappt und Dank deiner Hilfe konnte ich deine "greps" so umbauen, dass ich mir nun aus der  json 4 Temps "rausschneide" von 4 channels und die dann in eine RRD Database schreibe mit einem Script :bow: Super!

 

Nun verzweifele ich gerade daran ein erzeugtes PNG vom Server per FTP auf eine Fritz zu schicken... weil man beim Ubuntu Server Standard-FTP keine Login-Daten mitgeben kann... evtl hast Du dazu noch eine Idee? :ph34r: 

Dieses PNG enthält dann die Graphen von den Sensoren aus der RRD und das will ich dann irgendwie mit dem Tablet abrufen können (soll dann auch alle 30 Min per Script erstellt und auf die Fritz geschoben werden).

 

Danke nochmals!!! :D

Link zum Beitrag
Auf anderen Seiten teilen
  • Wer ist Online   0 Benutzer

    Keine registrierten Benutzer online.

×
×
  • Neu erstellen...