首页 > 解决方案 > 使用 sed 仅打印包含单词的行的部分内容

问题描述

我正在尝试创建一行,其中包含我的 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来实现,所以忽略算术请求

奖金目标

添加设备名称、度数符号,并仅显示 Sensor 的区别:

nvme0n1 40°C +0°C +3°C 

标签: sed

解决方案


使用 GNU sed:

sed -n 's/.*: *//; /C *$/H; ${g;s/\n//g;p}'

输出:

40℃ 40℃ 43℃

sed -n 's/.*: *//; s/ $//; 1h; /C *$/H; ${g;s/\n/ /g;p}' file

输出:

nvme0n1 40 C 40 C 43 C

看:man sed


推荐阅读