我正在尝试创建一行,其中包含我的NVMe驱动器的温度值,仅使用sed。
在第一个芯片上使用智能日志的nvme的输出
sudo nvme smart-log /dev/nvme0n1
Smart Log for NVME device:nvme0n1
namespace-id:ffffffff
critical_warning : 0
temperature : 40 C
available_spare : 100%
available_spare_threshold : 10%
percentage_used : 0%
data_units_read : 88.659
data_units_written : 351.868
host_read_commands : 659.265
host_write_commands : 787.770
controller_busy_time : 5
power_cycles : 17
power_on_hours : 6
unsafe_shutdowns : 1
media_errors : 0
num_err_log_entries : 2
Warning Temperature Time : 0
Critical Composite Temperature Time : 0
Temperature Sensor 1 : 40 C
Temperature Sensor 2 : 43 C
Thermal Management T1 Trans Count : 0
Thermal Management T2 Trans Count : 0
Thermal Management T1 Total Time : 0
Thermal Management T2 Total Time : 0第一步是只选择以"C“结尾的行
sudo nvme smart-log /dev/nvme0n1 | sed -n '/C$/p'
temperature : 40 C
Temperature Sensor 1 : 40 C
Temperature Sensor 2 : 43 C但我不想打印它们,而是想删除冒号之前的所有文本,并删除换行符并将输出输出到:
40 C 40 C 43 C但我被整个模式/容纳空间卡住了。任何帮助都将不胜感激。
这只能通过awk实现,因此忽略算术请求
奖金目标
添加设备名称、度数符号,并仅显示传感器的差异:
nvme0n1 40°C +0°C +3°C发布于 2021-02-28 02:19:43
使用GNU sed:
sed -n 's/.*: *//; /C *$/H; ${g;s/\n//g;p}'输出:
40 C 40 C 43 Csed -n 's/.*: *//; s/ $//; 1h; /C *$/H; ${g;s/\n/ /g;p}' file输出:
nvme0n1 40 C 40 C 43 C请参见:man sed
发布于 2021-02-28 02:20:12
sed -n '
# if it's a line ending with C, then ignore it
/C $/!d;
# ignore stuff before :
s/.*: //;
# replace C with °C
s/ C/°C/;
# Remove all spaces. There is a space after C
s/ //g;
# append a +line into hold space
H
# On the last line
${
# Take stuff from the hold space
x; # or `g`
# Remove leading newline
s/^\n//;
# join lines with spaces
s/\n/ /g;
# print and exit
p; q;
};
'将输出:
40°C 40°C 43°Csed是一个简单的正则表达式替换实用程序。例如,要在sed中减去两个数字,基本上必须生成所有可能的组合:
sed 's/1-1/0/; s/2-1/1/; s/3-1/2/; s/ ... all possible combinations of numbers ... '..。
要计算数字之间的差值,请使用awk..。
发布于 2021-03-01 02:41:11
另一种使用GNU的方法sed将会是
sed -E 's/^/\n/; :a; s/\n.*: ([0-9]+ C )$/\1/; s/\n.*//; $!{N; ba}'此版本不使用保留缓冲区,但可能比使用它的版本效率低。
https://stackoverflow.com/questions/66401875
复制相似问题