Personalize a saída do sensor e salve-o no arquivo

1

Eu queria saber como reformatar a saída do terminal para informações de registro. Mais especificamente, gostaria de reformatar a saída do comando sensors do pacote lm-sensors e gravá-lo em um arquivo. A saída é algo como isto:

acpitz-virtual-0
Adapter: Virtual device
temp1:        +61.0°C  (crit = +99.0°C)
temp2:        +29.8°C  (crit = +99.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +63.0°C  (high = +86.0°C, crit = +100.0°C)
Core 0:         +62.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:         +59.0°C  (high = +86.0°C, crit = +100.0°C)
Core 2:         +63.0°C  (high = +86.0°C, crit = +100.0°C)
Core 3:         +61.0°C  (high = +86.0°C, crit = +100.0°C)

radeon-pci-0100
Adapter: PCI adapter
temp1:        +61.5°C

Meu propósito para reformatar é, para mais tarde, usar os dados com o gnuplot (plotagem em tempo real). Então, o resultado deve ser semelhante a este:

# Timestamp [hh:mm:ss]    temp1 [°C]       temp2 [°C]     ... 
13:45:52                  65.0             29.0            .
13:45:53                  66.0             28.0            .
13:45:54                  64.0             27.0            .
13:45:55                  55.0             26.0            .
...                       ...              ...             .

Eu gostaria de usar isso em vários computadores com uma quantidade diferente de sensores, o que exigiria algum tipo de loop. Mas de onde para um loop e como eliminar as linhas redundantes (por exemplo, acpitz-virtual-0, Adapter: Virtual device, ...). Também estou ciente dos recursos do pacote lm-sensors para produzir gráficos. Mas eu gostaria de realizar uma solução homebrew e também manter a questão mais geral.

    
por Sensei 11.06.2013 / 21:56

1 resposta

0

Eu tenho o mesmo problema e implementei uma solução:

Usando sed para analisar a saída canalizada de sensors com expressões regulares, o resultado é anexado ao arquivo de log.

  1. A data é gravada como timestamp do UNIX para arquivo e formatada como stdout. Para suprimir a quebra de linha, o comando echo -n "$(date +"%H:%M:%S") é usado.
  2. Em seguida, a saída de sensors é canalizada para sed para analisar cada linha para encontrar as temperaturas pesquisando por °C .
  3. O resultado é canalizado para sed . Agora a string é dividida em três partes: O nome do sensor no início com dois pontos e espaços em branco ^[a-zA-Z0-9 ]*:\s* , A temperatura consistindo em sinal, números e ponto \([0-9.+-]*\) e o restante no final da string .*$ . A segunda parte é marcada como referência pelo uso dos parênteses.
  4. O resultado é novamente canalizado para sed para remover as quebras de linha. Clique para detalhes
  5. Os scripts duram por X segundos. (No meu caso 5 segundos.)

O script em lote resultante:

# Printing the names of the columns as first row in file
echo "Time;     temp1;  temp2;  Physical id 0;  Core 0; Core 1; Core 2; Core 3; SIO Temp;       temp3" > Temperatures.log
while true
do
    # Printing the time and all temperatures to stdout
    echo -n "$(date +"%H:%M:%S"): "
    sensors | sed -n "/°C/p" | sed "s/^[a-zA-Z0-9 ]*:\s*\([0-9.+-]*\).*$//" | sed ':a;N;$!ba;s/\n/;\t/g'

    # Logging time as UNIX time and temperatures to file
    echo -n "$(date +"%s");     " >> Temperatures.log
    sensors | sed -n "/°C/p" | sed "s/^[a-zA-Z0-9 ]*:\s*\([0-9.+-]*\).*$//" | sed ':a;N;$!ba;s/\n/;\t/g' >> Temperatures.log

    # Sleeping for X seconds
    sleep 5
done
    
por 09.01.2015 / 17:27

Tags