# m h dom mon dow command
34 * * * * echo -n $(/usr/bin/date '+%%F\ %%T,') >> /home/leo/templog.csv
35 * * * * echo -n $(/usr/bin/date +%%F\ %%T, ) >> /home/leo/templog.csv
48 * * * * echo -n $(/usr/bin/date) >> /home/leo/templog.csv
34 e 35 funzionano regolarmente da linea di comando.
ma da cron non vanno: la prima mi da
/bin/sh: 1: Syntax error: Unterminated quoted string
e la seconda
/bin/sh: 1: Syntax error: end of file unexpected (expecting ")")
la numero 48 funziona, ma non scrive quello che vorrei.
come risolvo ?
--
Leonardo Boselli
Firenze, Toscana, Europa
# m h dom mon dow  command
34 * * * * echo -n $(/usr/bin/date '+%%F\ %%T,') >>
/home/leo/templog.csv
35 * * * * echo -n $(/usr/bin/date +%%F\ %%T, ) >>
/home/leo/templog.csv
48 * * * * echo -n $(/usr/bin/date) >> /home/leo/templog.csv
34 e 35 funzionano regolarmente da linea di comando.
ma da cron non vanno: la prima mi da
/bin/sh: 1: Syntax error: Unterminated quoted string
Proverei a mettere tutto all'interno di uno scrip e poi pianificare
quello.
si, ha funzionato (e comeunque il problema era nel %), ma ora ho un
altro problema:
dopo quel campo nel file ci debbono andare altri due campi, presi da
due altri programmi per ora ho rimediato con un programma in C, ma non
è molto portatile.
Questi programmi mi mandano fuori un formato simile [praticamante
identico] a quello di sensors, ossia
nome record1
nome campo1: <valore1><Unità di misura1>
nome campo2: <valore2><Unità di misura2>
\n
e così ripetuto per tante volte.
faccio notare che nome campo può essere qualsiasi sequenza di
caratteri, compreso lo spazio, e il separatore è il ':'
<valore> contiene solo [0-9.+-] e <unità di misura> qualsiasi sequenza
che non inizia per una cifra e può essere o meno separata da uno o più spazi (in pratica gli spazi vengono ignorati eccetto il newline).
Usando uno script standard unix come estraggo <valore> passandogli
come parametri <nome record> e <nome campo> ?
ancora più difficile: il file con questi dati è su un altra macchina e
lo ottengo con curl.
dovrebbe funzionare: $(<tuo comando> | cut -f2 -d: | egrep -o '^([0-9]*[.]*[0-9]*)');
...sempre che abbia capito bene
e
 filtrodipiviul dell_smm-isa-0000 "Processor Fan"
dovrebbe restituirmi "2716"
sono stato più chiaro ?
Sai che ancora non ho capito? Vuoi una funzione che prende in input ad esempio "dell_smm-isa-0000" "Processor Fan" e restituisca il valore presente nell'output di sensors per il "Processor Fan" dell'adapter dell_smm-isa-0000?
On Mon, 4 Nov 2024, Piviul wrote:
dovrebbe funzionare: $(<tuo comando> | cut -f2 -d: | egrep -o
'^([0-9]*[.]*[0-9]*)');
...sempre che abbia capito bene
no, non hai capito tutta la domanda: quella parte era la parte semplice. quello che mi serve è dare un comando
$(<mio comando>) | filtrodipiviul "record" "campo"
per intendersi, usando come comando sensors , che tutti hanno e
possono provare, e che fornisce i dati proprio in quel formato (ogni
macchina li da differentemente quindi adattate l'esempio se ho l'output
…
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +33.0°C (high = +100.0°C, crit = +100.0°C)
Core 0:       +32.0°C (high = +100.0°C, crit = +100.0°C)
Core 1:       +31.0°C (high = +100.0°C, crit = +100.0°C)
dell_smm-isa-0000
Adapter: ISA adapter
Processor Fan: 2716 RPM (min =   0 RPM, max = 4900 RPM) CPU:           +33.0°C
Ambient:       +27.0°C
SODIMM:        +27.0°C
acpitz-acpi-0
Adapter: ACPI interface
temp1:       +25.0°C (crit = +107.0°C)
iwlwifi_1-virtual-0
Adapter: Virtual device
temp1:       +33.0°C
…
allora
 filtrodipiviul acpitz-acpi-0 temp1
dovrebbe restituirmi "+25.0" (o anche 25)
e
 filtrodipiviul dell_smm-isa-0000 "Processor Fan"
dovrebbe restituirmi "2716"
sono stato più chiaro ?
Direi che devi fare una funzione che faccia il parsing tipo:
-8<--
#!/bin/bash
# parsefile outvar sezione chiave
function parsefile {
local -n result=$1
while read A; do
if [[ "$A" == "$2" ]]; then
# Trovata la sezione, cerca la entry
while read L; do
if [[ "$L" =~ .+:.+ ]]; then
# L è nel formato key:value
IFS=":" read K V <<<"$L"
# Rimuove gli spazi
V=$(echo $V| xargs)
if [[ "$K" == "$2" ]]; then
result=$V
return 0
fi
else
# Errore: fine sezione/file
return 1
fi
done
fi
done
}
val=""
parsefile val acpitz-acpi-0 temp1 < testfile.txt
echo "$val"
-8<--
(questo ritorna come valore tutto il campo, poi puoi farne un ulteriore parsing come ti serve)
Diego
Il 04/11/2024 09:51, Leonardo Boselli ha scritto:
On Mon, 4 Nov 2024, Piviul wrote:
dovrebbe funzionare: $(<tuo comando> | cut -f2 -d: | egrep -o
'^([0-9]*[.]*[0-9]*)');
...sempre che abbia capito bene
no, non hai capito tutta la domanda: quella parte era la parte semplice.
quello che mi serve è dare un comando
$(<mio comando>) | filtrodipiviul "record" "campo"
per intendersi, usando come comando sensors , che tutti hanno e possono
provare, e che fornisce i dati proprio in quel formato (ogni macchina li da >> differentemente quindi adattate l'esempio se ho l'output
…
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +33.0°C (high = +100.0°C, crit = +100.0°C)
Core 0:       +32.0°C (high = +100.0°C, crit = +100.0°C)
Core 1:       +31.0°C (high = +100.0°C, crit = +100.0°C)
dell_smm-isa-0000
Adapter: ISA adapter
Processor Fan: 2716 RPMÂ (min =Â Â Â 0 RPM, max = 4900 RPM)
CPU:           +33.0°C
Ambient:       +27.0°C
SODIMM:        +27.0°C
acpitz-acpi-0
Adapter: ACPI interface
temp1:       +25.0°C (crit = +107.0°C)
iwlwifi_1-virtual-0
Adapter: Virtual device
temp1:       +33.0°C
…
allora
 filtrodipiviul acpitz-acpi-0 temp1
dovrebbe restituirmi "+25.0" (o anche 25)
e
 filtrodipiviul dell_smm-isa-0000 "Processor Fan"
dovrebbe restituirmi "2716"
sono stato più chiaro ?
--
Leonardo Boselli
Firenze, Toscana, Europa
http://i.trail.it
--
Diego Zuccato
DIFA - Dip. di Fisica e Astronomia
Servizi Informatici
Alma Mater Studiorum - Università di Bologna
V.le Berti-Pichat 6/2 - 40127 Bologna - Italy
tel.: +39 051 20 95786
./pivtest.sh: line 10: syntax error near unexpected token `then' ./pivtest.sh: line 10: `Â Â Â if [ $found -eq 1 ]; then'
esatto !
$ cat .bin/myscript.sh
#/bin/bash
stanza=$1
field=$2
found=0
while read -r line
do
   f1=$(echo $line | cut -f1 -d:);
   if [ $found -eq 1 ]; then
       f2=$(echo $line | cut -f2 -d: | sed 's/^[[:space:]]*//');        if [ "$f1" = "$field" ]; then
           echo $f2 | egrep -o '^[[:space:]]*([\+]*[0-9]*[.]*[0-9]*)';
           found=0
           break;
       else
           continue
       fi
   else
       [ "$f1" = "$stanza" ] && found=1 && continue
   fi
done
$ sensors | .bin/myscript.sh "coretemp-isa-0000" "Core 5"
+23.0
On 11/4/24 11:52, Leonardo Boselli wrote:
esatto !
Quindi qualcosa del genere?
$ cat .bin/myscript.sh
#/bin/bash
stanza=$1
field=$2
found=0
while read -r line
do
   f1=$(echo $line | cut -f1 -d:);
   if [ $found -eq 1 ]; then
       f2=$(echo $line | cut -f2 -d: | sed 's/^[[:space:]]*//');
       if [ "$f1" = "$field" ]; then
           echo $f2 | egrep -o '^[[:space:]]*([\+]*[0-9]*[.]*[0-9]*)';
           found=0
           break;
       else
           continue
       fi
   else
       [ "$f1" = "$stanza" ] && found=1 && continue
   fi
done
$ sensors | .bin/myscript.sh "coretemp-isa-0000" "Core 5"
+23.0
è la copia di qiello che hai podtato.
no ... ho fatto una prova e il problema è più sottile: nel primo messaggio ho tolto i > ma gli spazi erano ... NBSP ( U+00A0 ) e pare che bash non sia tanto tollerante.
Anche diff, malgrado il -b li vedeva diversi, ma non lo faceva vedere [sul terminale con spaziatura fissa la rappresentazione di SP e NBSP è identica]
Perdonatemi, ma cosa è NBSP ( U+00A0 )?
E come li hai visti?
Spesso mi imbatto in problemi simili ed ogni volta l'unica soluzione che trovo, è quella di cancellare gli spazi e rimetterli. Finché sono una decina di righe va pure bene ma quando di tratta di un centinaio, inizia a diventare un problema.
lo script che non funzina lo ho copiato apri pari
e il risultato di diff è:
[...]
quelloc he mi hai mandato come attachment non da errori (a parte che
accetta solo Core 0 e Core 1) ma come ho detto ogni macchian ha un
differente output. (e lo ho copiato uguale, con on copy&paste dal
messaggio.)
$ sensors && sensors | .bin/myscript.sh "coretemp-isa-0000" "Core 0"
&& sensors | .bin/myscript.sh "coretemp-isa-0000" "Core 1" && sensors
| .bin/myscript.sh "acpitz-acpi-0" "temp1" && sensors |
.bin/myscript.sh "iwlwifi_1-virtual-0" "temp1"
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +28.0°C (high = +80.0°C, crit = +100.0°C)
Core 0:       +26.0°C (high = +80.0°C, crit = +100.0°C)
Core 1:       +25.0°C (high = +80.0°C, crit = +100.0°C)
Core 2:       +26.0°C (high = +80.0°C, crit = +100.0°C)
Core 3:       +25.0°C (high = +80.0°C, crit = +100.0°C)
Core 4:       +25.0°C (high = +80.0°C, crit = +100.0°C)
Core 5:       +25.0°C (high = +80.0°C, crit = +100.0°C)
acpitz-acpi-0
Adapter: ACPI interface
temp1:       +27.8°C (crit = +105.0°C)
iwlwifi_1-virtual-0
Adapter: Virtual device
temp1:       +30.0°C
+26.0
+25.0
+27.8
+30.0
On 11/4/24 16:38, Leonardo Boselli wrote:
lo script che non funzina lo ho copiato apri pari
e il risultato di diff è:
leo@h7136:~$ diff -b -Z -E pivtest.sh pivtesto.sh
9,21c9,21
< Â Â Â f1=$(echo $line | cut -f1 -d:);
< Â Â Â if [ $found -eq 1 ]; then
...credo di aver capito. Il primo script te l'ho quotato nel messaggio in solo testo. Se tu lo copi e lo metti in un file .sh devi togliergli il carattere di quote (>) all'inizio di ogni riga.
Piviul
no ... ho fatto una prova e il problema è più sottile: nel primo
messaggio ho tolto i > ma gli spazi erano ... NBSP ( U+00A0 ) e pare
che bash non sia tanto tollerante.
Anche diff, malgrado il -b li vedeva diversi, ma non lo faceva vedere
[sul terminale con spaziatura fissa la rappresentazione di SP e NBSP è identica]
beh, abbiamo capito che hai avuto delle difficoltà a generare lo script quotato in un messaggio di posta ma lo script che ti ho mandato in allegato, lo hai provato?
BTW: l'ho scritta di getto, senza controllare più di tanto: meglio
pigliarla cum grano salis.
certo, funziona perfettamente
Il giorno mar, 05/11/2024 alle 13.25 +0100, Lem ha scritto:
BTW: l'ho scritta di getto, senza controllare più di tanto: meglio
pigliarla cum grano salis.
Ecco, appunto. Meglio aggiungere il quoting fra virgolette doppie ai parametri posizionali, per esempio:
| $ filtro () { sed '/^'"$1"'/,/^'"$2"': /!d;/^'"$2"':/!d;s/'"$2"':[[:space:]]*//'| grep -o "^[.0-9+\-]\+" ; }
--
Bye, Lem
no ... ho fatto una prova e il problema è più sottile: nel primo messaggio ho tolto i > ma gli spazi erano ... NBSP ( U+00A0 ) e pare che bash non sia tanto tollerante.
Anche diff, malgrado il -b li vedeva diversi, ma non lo faceva vedere [sul terminale con spaziatura fissa la rappresentazione di SP e NBSP è identica]
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 546 |
Nodes: | 16 (0 / 16) |
Uptime: | 156:33:35 |
Calls: | 10,384 |
Calls today: | 1 |
Files: | 14,056 |
Messages: | 6,416,471 |