script und austausch einzelner wörter

Brusko

Well-Known Member
Guten Abend, hier mal mein script das bislang die Temperaturen ausliest :

PHP:
#!/bin/sh
# script zum starten des Programmes Digitemp_DS9097
# mit chown root tempscript.sh 
#     chmod u+s tempscript.sh  bearbeitet
# in /etc/newsyslog.conf mus eingeben werdem:
#    /home/michael/templogfile.log root:wheel 640   7   *   @T00   N
# in /etc/crontab mus eingeben werden:
#    */2  *  *  *  *  root  /home/michael/tempscript.sh >/dev/null 2>&1 letzte wegen ausgabe zu null wichtig
# es muss sysutils/smartmontools installiert sein
# es muss sysutils/mbmon installiert sein
# Fuehleranzahl mit Festplatte usw rechnen

anzahlfuehler=22 
templogdatei=/home/michael/templogfile.log
schnittstelle=/dev/cuad0
ausleseProgramm=/usr/local/bin/digitemp_DS9097 
auslesesmartctl=/usr/local/sbin/smartctl
hardwaretemp=/usr/local/bin/mbmon
festplatte1=/dev/ad0
tageszeit=`date +%H:%M`
zeitstempel=`date +%b" "%d" "%H:%M:%S`
upzeit=`expr \( $(date +%s) - $(sysctl -n kern.boottime | awk -F '[ ,]' '{print $4}') \)`

# Lese und Speicher  Sensoren wenn es 00:00 ist
# oder nach einem Neustart wenn upzeit kleiner/gleich 120 sec
if [ "$tageszeit" = "00:00" -o $upzeit -le 120 ]
  then
      $ausleseProgramm -i -s $schnittstelle >> $templogdatei
      echo Sensoren initialisiert! >> $templogdatei
fi

# Lese und Speicher Temperatur
echo $zeitstempel Festplatte $festplatte1 C: `$auslesesmartctl -a $festplatte1 | awk '/^194/ {print $10}'` >> $templogdatei
echo $zeitstempel Motherboard C: `$hardwaretemp -r -c1 | awk 'NR==1 {print $3}'` >> $templogdatei 
echo $zeitstempel CPU C: `$hardwaretemp -r -c1 | awk 'NR==2 {print $3}'` >> $templogdatei
echo $zeitstempel Mainboard/Kontroll-Chip C: `$hardwaretemp -r -c1 | awk 'NR==3 {print $3}'` >> $templogdatei
$ausleseProgramm -s $schnittstelle -r -750 -a -l $templogdatei -o "%b %d %H:%M:%S Sensor Nr.:%s %R C: %.2C"

# Lese die letzten $anzahlfuehler Zeilen der $templogdatei aus und ueberpruefe
# ob sich da beendet! oder initialisiert! befindet 
letztenzeilen=`tail -n $anzahlfuehler /$templogdatei`
if [ -n "`echo $letztenzeilen | grep -w -e beendet! -e initialisiert!`" ]
  then
      echo !!!Fehler!!! >> $templogdatei
  else
      echo Auslesung beendet! >> $templogdatei
fi

Die Ausgabe in der Datei templogdatei sieht so aus :

PHP:
Apr 26 21:06:00 Festplatte /dev/ad0 C: 27
Apr 26 21:06:00 Motherboard C: 35.5
Apr 26 21:06:00 CPU C: 47.2
Apr 26 21:06:00 Mainboard/Kontroll-Chip C: 21.6
Apr 26 21:06:02 Sensor Nr.:0 10603F72010800A1 C: 20.94
Apr 26 21:06:03 Sensor Nr.:1 1004BB720108006A C: 20.88
Apr 26 21:06:04 Sensor Nr.:2 1094B372010800E5 C: 20.94
Apr 26 21:06:05 Sensor Nr.:3 104A85720108002A C: 20.88
Apr 26 21:06:07 Sensor Nr.:4 101A9072010800AA C: 20.94
Apr 26 21:06:08 Sensor Nr.:5 10DA9672010800A9 C: 21.00
Apr 26 21:06:09 Sensor Nr.:6 10FABB720108000B C: 20.88
Apr 26 21:06:10 Sensor Nr.:7 1076337201080069 C: 20.94
Apr 26 21:06:12 Sensor Nr.:8 103E3B7201080083 C: 21.00
Apr 26 21:06:13 Sensor Nr.:9 1081377201080081 C: 20.81
Apr 26 21:06:14 Sensor Nr.:10 10C1B272010800ED C: 20.94
Apr 26 21:06:15 Sensor Nr.:11 105134720108000B C: 20.94
Apr 26 21:06:16 Sensor Nr.:12 10D999720108009F C: 20.81
Apr 26 21:06:18 Sensor Nr.:13 10E53072010800CF C: 20.94
Apr 26 21:06:19 Sensor Nr.:14 10437F72010800A7 C: 20.88
Apr 26 21:06:20 Sensor Nr.:15 10332D99010800F4 C: 20.88
Apr 26 21:06:21 Sensor Nr.:16 10C7A8720108009E C: 20.94
Apr 26 21:06:23 Sensor Nr.:17 105FB2720108004F C: 20.94
Auslesung beendet!
nun möchte ich gerne im script mit einbauen das er zum schluss die letzten 18 fühlerzeilen ausliest (der block wird alle 2 minuten mit neuen daten drangehangen)
und dann den 16stelligen Code austauscht...z.b fühler 17 105FB2720108004F soll woh wohnzimmer sein. wäre das so machbar ?

grüße Michael
 
Zuletzt bearbeitet:
Ersetzungen kannst du einfach mit sed machen.

sed -e "s/105FB2720108004F/Wohnzimmer/1" -e "s/10C7A8720108009E/Arbeitszimmer/1" $templogdatei

Würde so etwas machen.
 
danke für die schnelle anwort werde es morgen abend mal versuchen. geht es denn nur wörter weise ? müste ja so jede zeile extra umändern oder kann man das irgendwie im Block einbauen wie z.B

Daten=" 16 code fühler 1; 16 code fühler 2; usw"
datentausch=" Wohnzimmer ; Flur; usw"

und das ganze inne schleife ?
 
Klar geht das.

Code:
IFS='
'
sensors="105FB2720108004F/Wohnzimmer
10C7A8720108009E/Flur
10332D99010800F4/Arbeitszimmer"

sedcmd='sed'
for sensor in $sensors; {
    sedcmd="$sedcmd -e 's/$sensor/1'"
}

eval "$sedcmd $templogdatei"

Was du mit Daten bezweckst verstehe ich nicht.
 
daten war nun einfach ein Wort das ich dafür genommen hatte.
Nun da mus ich wohl mal die tage etwas googeln damit ich überhaubt verstehe was dein Code genau zu bedeuten hat *g* aufjedenfall schon mal vielen dank dafür

Michael
 
Die letzte zeile muss aber dann ja doch heißen

eval "$sedcmd < $templogdatei > templogfile.txt"
damit er die eine einlist und eine andere neu ausgibt,,die gleiche datei geht ja nicht weil sie dann leer ist
zumindest laut dem was ich bei mir habe.
oder sehe ich das Falsch ?

aber wieso geht das denn nur wenn in das script per "hand" starte durch sh script.sh
und wenn ich es per crontab starte wird das sed nicht ausgeführt

Michael
 
Zuletzt bearbeitet:
Guten tag,

Also mit sed -i klappt dat auch net und mus ich für sed extra Path in crontab setzten ?

hier nochmal das ganze script.

#!/bin/sh
# script zum starten des Programmes Digitemp_DS9097
# mit chown root tempscript.sh
# chmod u+s tempscript.sh bearbeitet
# in /etc/newsyslog.conf mus eingeben werdem:
# /home/michael/templogfile.log root:wheel 640 7 * @T00 N
# in /etc/crontab mus eingeben werden:
# */2 * * * * root /home/michael/tempscript.sh >/dev/null 2>&1 letzte wegen ausgabe zu null wichtig
# es muss sysutils/smartmontools installiert sein
# es muss sysutils/mbmon installiert sein
# Fuehleranzahl mit Festplatte usw rechnen

anzahlfuehler=22
templogdatei=/home/michael/puffertemplogfile.puffer
schnittstelle=/dev/cuad0
ausleseProgramm=/usr/local/bin/digitemp_DS9097
auslesesmartctl=/usr/local/sbin/smartctl
hardwaretemp=/usr/local/bin/mbmon
festplatte1=/dev/ad0
tageszeit=`date +%H:%M`
zeitstempel=`date +%b" "%d" "%H:%M:%S`
upzeit=`expr \( $(date +%s) - $(sysctl -n kern.boottime | awk -F '[ ,]' '{print $4}') \)`

# Lese und Speicher Sensoren wenn es 00:00 ist
# oder nach einem Neustart wenn upzeit kleiner/gleich 120 sec
if [ "$tageszeit" = "00:00" -o $upzeit -le 120 ]
then
$ausleseProgramm -i -s $schnittstelle >> $templogdatei
echo Sensoren initialisiert! >> $templogdatei
fi

# Lese und Speicher Temperatur
echo $zeitstempel Festplatte $festplatte1 C: `$auslesesmartctl -a $festplatte1 | awk '/^194/ {print $10}'` >> $templogdatei
echo $zeitstempel Motherboard C: `$hardwaretemp -r -c1 | awk 'NR==1 {print $3}'` >> $templogdatei
echo $zeitstempel CPU C: `$hardwaretemp -r -c1 | awk 'NR==2 {print $3}'` >> $templogdatei
echo $zeitstempel Mainboard/Kontroll-Chip C: `$hardwaretemp -r -c1 | awk 'NR==3 {print $3}'` >> $templogdatei
$ausleseProgramm -s $schnittstelle -r -750 -a -l $templogdatei -o "%b %d %H:%M:%S Sensor Nr.:%s %R C: %.2C"

# Lese die letzten $anzahlfuehler Zeilen der $templogdatei aus und ueberpruefe
# ob sich da beendet! oder initialisiert! befindet
letztenzeilen=`tail -n $anzahlfuehler /$templogdatei`
if [ -n "`echo $letztenzeilen | grep -w -e beendet! -e initialisiert!`" ]
then
echo !!!Fehler!!! >> $templogdatei
else
echo Auslesung beendet! >> $templogdatei
fi

# Aendere Fuehlercode in Namen
IFS='
'
sensors="105FB2720108004F/Wohnzimmer
10C7A8720108009E/Flur"

sedcmd='sed'
for sensor in $sensors; {
sedcmd="$sedcmd -e 's/$sensor/1'"
}

eval "$sedcmd < $templogdatei > test.test"

er schreibt nicht mal die datei test.test auser ich starte es mit sh an der shell
und in crontab hab ich als PATH =/etc:/bin:/sbin:/usr/bin:/usr/sbin

mus ich da nun extra für sed noch ein verzeichnis eingeben ? wenn ja welches denn.
Mir wäre aber lieber wenn ich nicht alszuviel in Crontab schreibe sondern es vom script aus kommt

Michael
 
Zuletzt bearbeitet:
In Crontab ist normalerweise PATH nicht gesetzt. Da musst du eigentlich alle Kommandos mit vollständigen Pfaden aufrufen.

sedcmd='/usr/bin/sed -i'
 
Also irgendwie mus ich da wohl nicht ganzklarkommen, wenn ich den pfad im script ganz angebe gehts auch nicht, das gleiche, mit Hand ja per cron nicht.

gibgt es noch ne andere möglichkeit wörter auszutauschen ?
 
Autsch tut dat weh ich hab den fehler anscheinend gefunden *kopf schüttelt*

und zwar hab in der letzten zeile :
eval "$sedcmd < $templogdatei > test.test"

nicht den vollen Pfad der ausgabedatei angegeben und das kann crontab wohl nicht es mus heißen

eval "$sedcmd < $templogdatei > /usr/home/michael/test.test"

da auch $templogdatei ja:
/usr/home/michael/puffertemplogfile.puffer
bedeutet
 
Zurück
Oben