端末出力をログ情報に再フォーマットする方法を知りたいです。具体的には、パッケージsensors
のコマンド出力を再フォーマットしてlm-sensors
ファイルに書きたいと思います。出力は次のとおりです。
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
再フォーマットする目的は、後でgnuplot(ライブプロット)データを使用することです。したがって、結果は次のようになります。
# 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 .
... ... ... .
ある種のループを必要とするセンサーの数が異なる複数のコンピュータで使用したいと思います。ただし、冗長行を削除する場所と方法のループがあります(例:acpitz-virtual-0、アダプタ:仮想デバイスなど)。lm-sensors
チャートを生成するパッケージ機能も知っています。しかし、私は自家製のソリューションを実装し、問題をより一般化したいと思います。
答え1
私は同じ問題があり、解決策を実装しました。
sed
パイプライン出力は正規表現を使用して解析され、sensors
結果はログファイルに追加されます。
- 日付はUNIXタイムスタンプとしてファイルに書き込まれ、標準出力形式で指定されます。改行を抑制するには、
echo -n "$(date +"%H:%M:%S")
このコマンドを使用します。 - 次に、出力を
sensors
パイプしてsed
各行を解析し、サーチを通じて温度を検索します°C
。 - 結果はagineにパイプされます
sed
。これで、文字列は3つの部分に分けられます。コロンとスペースで始まるセンサー名^[a-zA-Z0-9 ]*:\s*
、記号、数字、点で構成される温度、\([0-9.+-]*\)
文字列の終わりまでの残りの部分.*$
。 2番目の部分は括弧を使用して参照として表示されます。 - 改行文字を削除するために結果が再パイプされます
sed
。詳細についてはクリックしてください。 - スクリプトはX秒間休止状態です。 (私の場合は5秒。)
生成されたバッチスクリプト:
# 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.+-]*\).*$/\1/" | 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.+-]*\).*$/\1/" | sed ':a;N;$!ba;s/\n/;\t/g' >> Temperatures.log
# Sleeping for X seconds
sleep 5
done