我想知道如何重新格式化终端输出以记录信息。更具体地说,我想重新格式化 包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
。现在字符串被分为三个部分:传感器的名称以冒号和空格开头^[a-zA-Z0-9 ]*:\s*
,温度由符号、数字和点组成,\([0-9.+-]*\)
其余到字符串的末尾.*$
。第二部分通过使用括号标记为参考。 - 结果再次通过管道传送以
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