Bash Ausgabe kürzen...

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    Hallo zusammen,
    Ich lasse meinen DHT22 Sensor mittels script auslesen und möchte die Werte in eine Datenbank schreiben.
    Wenn ich den Befehl /lol_dht22/loldht 7ausführe, bekomme ich als Ergebnis:

    Code
    Raspberry Pi wiringPi DHT22 reader
    www.lolware.net
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Humidity = 44.00 % Temperature = 24.20 *C


    Die Fehlermeldung Data not good, skip kommt mal öfter mal garnicht..
    Nun möchte ich die Ausgabe soweit einkürzen das egal was das Script ausspuckt nur die Zahlenwerte

    Code
    44.00 %24.20 *C


    übrig bleiben.
    Diese Zahlenwerte sollen dann in die DB geschrieben werden.

    Mein Script sieht bisher wie folgt aus:

    Der Eintrag in die DB funktioniert, allerdings werden nicht die gewünschten Werte eingetragen.
    Er sieht so aus...
    db.jpg

    Und an dieser Stelle hänge ich nun und komme nicht weiter...
    Ich wäre euch für eine Lösung meines Problems sehr dankbar.

    LG Markus (CCED)

    Einmal editiert, zuletzt von cced (11. August 2014 um 17:23)

  • Auf die schnelle aus dem Hirn.

    Code
    LUFT=$(echo $WERTE | grep Humidity | awk 'print $2 $3')
     TEMP=$(echo $WERTE | grep Humidity | awk 'print $6 $7')

    Einfach mal versuchen, wie gesagt ungetestet aus dem Hirn geholt ;)

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.


  • Mit einem echten awk geht das so:

    Die awk-Version auf dem Pi ist aber nicht ganz vollstaendig, es kann daher sein, dass die nicht alles kann.


    Hallo Tell,
    Danke für den Code, warscheinlich liegts an mir....
    aber die Auswertung funktioniert, es werden nur die von mir gewünschten Daten ausgelesen,
    aber es wird nichts in die DB geschrieben.
    mit printf schreibt mir die Console nur die Insert line.. führt sie aber nicht aus :(

    Das sist mein Ergebnis :-([/code]

    Code
    root@PI-Server:/home/pi/scripts# ./dht22.sh
    INSERT INTO dht22,daten(time,luft,temp) VALUES("1407782022","51.30","24.10")root@PI-Server:/home/pi/scripts#


    Und... Ja, die zeile wird tatsächlich so in einem durchgeschrieben. "root@PI-Server:/home/pi/scripts#" ängt direkt dahinter...


    Auf die schnelle aus dem Hirn.


    Danke,
    :) Aber leider mit syntaxfehler... da bin ich noch nicht fit genug....

    Einmal editiert, zuletzt von cced (11. August 2014 um 20:36)

  • Hallo cced,

    > aber es wird nichts in die DB geschrieben.
    Ist klar, mein Code gibt auch nur das INSERT aus :thumbs1:

    > mit printf schreibt mir die Console nur die Insert line.. führt sie aber nicht aus :(
    Das muss man jetzt noch mit der Pipe kombinieren:

    Code
    awk '/Humidity/ { printf( "NSERT INTO db,table (time,luft,temp) VALUES(\"%s\",\"%s\",\"%s\")\n", strftime("%s"), $3, $7 ) ; }' datenfile | mysql -h $mySQLserver -P $mySQLport -u $mySQLuser -p"$mySQLpass" $mySQLdatabase

    Den Code hinter der Pipe habe ich einfach aus dem vorherigen Script kopiert.
    Wenn das schon lief, laeuft es jetzt auch wieder ...

    Einmal editiert, zuletzt von Tell (11. August 2014 um 21:25)


  • Hallo cced,

    Code
    awk '/Humidity/ { printf( "NSERT INTO db,table (time,luft,temp) VALUES(\"%s\",\"%s\",\"%s\")\n", strftime("%s"), $3, $7 ) ; }' datenfile | mysql -h $mySQLserver -P $mySQLport -u $mySQLuser -p"$mySQLpass" $mySQLdatabase

    leider nicht.
    denn jetzt... oh man, ich glaube ich sollte ins Bett gehen....

    Code
    root@PI-Server:/home/pi/scripts# ./dht22.sh
    ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'daten (time,luft,temp) VALUES("1407788102","51.00","24.10")' at line 1
    root@PI-Server:/home/pi/scripts#

    und den hatte ich zuvor nicht :(

    Habe den Fehler :-((


    , statt .


    Danke für deine Hilfe!!!!!!!!!

    Einmal editiert, zuletzt von cced (11. August 2014 um 22:22)


  • Wenn ich den Befehl /lol_dht22/loldht 7ausführe, bekomme ich als Ergebnis:

    Code
    Raspberry Pi wiringPi DHT22 reader
    www.lolware.net
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Humidity = 44.00 % Temperature = 24.20 *C


    Die Fehlermeldung Data not good, skip kommt mal öfter mal garnicht..
    Nun möchte ich die Ausgabe soweit einkürzen das egal was das Script ausspuckt nur die Zahlenwerte

    Bis du zunächst sicher das Humidity und Temperature wirklich in der selben Zeile stehen, aber nicht untereinander :huh:

    Da dein LUFT und TEMP nicht wirklich nur die gewünschten Zeilen beachtet, werden nicht Zahlen eingetragen sondern "Raspberry". Wieso benutzt du überhaupt cut -d "," ? Das trifft auf keiner der wichtigen Zeilen Humidity oder Temperature zu...
    Du solltest du bei der Rückgabe des Befehls /lol_dht22/loldht 7 nur die Zeilen ausgeben lassen die dich interessieren.

    Das nächste ist aber auch das WERTE später nur noch eine einzige Zeile ist. Wenn du das also selber mal in der Konsole ausprobierst:

    Code
    WERTE=$(/lol_dht22/loldht 7)
    echo $WERTE

    merkst was ich damit meine..

    Es wäre also besser du leitest die Ausgabe von /lol_dht22/loldht zunächst in eine Temporäre Datei um und wendest darauf dann deine Suchbefehle an um die entsprechenden Zeilen raus zu filtern:

    Code
    /lol_dht22/loldht 7 > /tmp/WERTE
    
    
    HUM=$(grep "Humidity" /tmp/WERTE | cut -d "=" -f 2)
    TEMP=$(grep "Temperature" /tmp/WERTE | cut -d "=" -f 2)

    Das ist aber noch nicht optimal, da dir jetzt noch die Sonderzeichen % und *C angezeigt werden. Das kann man auch mit awk zu bewerkstelligen:

    Code
    grep "Humidity" /tmp/WERTE | awk -F" " {'print $3'}
  • [ Klugscheiß ]
    In dem Fall kann man aber das -F " " weglassen denn das Leerzeichen ist der Standarttrenner von awk.
    [ /Klugscheiß ]

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

    Einmal editiert, zuletzt von Lunepi (12. August 2014 um 08:30)

  • Sorry, ich nochmal :)

    Wie bekomme ich die Ausgabe des folgenden Echo´s in eine Variable?

    Code
    "scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000005077d05/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l


    Versucht habe ich es schon mit:

    Code
    r1 = "scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000005077d05/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l
    Code
    r1 = scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000005077d05/w1_slave | awk -F't=' '{print $2}')/1000 | bc -l
    Code
    r1 'scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000005077d05/w1_slave | awk -F't=' '{print $2}')/1000' | bc -l
    Code
    r1 =  scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000005077d05/w1_slave | awk -F't=' '{print $2}')/1000 | bc -l
    Code
    r1 =  '"scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000005077d05/w1_slave | awk -F't=' '{print $2}')/1000"' | bc -l


    LG Markus


  • WAS soll der Befehl machen ?

    Hallo, der Befehl soll einen Temperatursensor auslesen und den Wert in einer Variablen speichern.

    Code
    echo "scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000005077d05/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l


    Ausgabe=

    Code
    25.000

Jetzt mitmachen!

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