首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed仅打印包含单词的行的一部分

使用sed仅打印包含单词的行的一部分
EN

Stack Overflow用户
提问于 2021-02-28 02:05:00
回答 3查看 69关注 0票数 1

我正在尝试创建一行,其中包含我的NVMe驱动器的温度值,仅使用sed。

在第一个芯片上使用智能日志的nvme的输出

代码语言:javascript
复制
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“结尾的行

代码语言:javascript
复制
sudo nvme smart-log /dev/nvme0n1 | sed -n '/C$/p'
temperature                         : 40 C
Temperature Sensor 1                : 40 C
Temperature Sensor 2                : 43 C

但我不想打印它们,而是想删除冒号之前的所有文本,并删除换行符并将输出输出到:

代码语言:javascript
复制
40 C 40 C 43 C

但我被整个模式/容纳空间卡住了。任何帮助都将不胜感激。

这只能通过awk实现,因此忽略算术请求

奖金目标

添加设备名称、度数符号,并仅显示传感器的差异:

代码语言:javascript
复制
nvme0n1 40°C +0°C +3°C
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-28 02:19:43

使用GNU sed:

代码语言:javascript
复制
sed -n 's/.*: *//; /C *$/H; ${g;s/\n//g;p}'

输出:

代码语言:javascript
复制
40 C 40 C 43 C
代码语言:javascript
复制
sed -n 's/.*: *//; s/ $//; 1h; /C *$/H; ${g;s/\n/ /g;p}' file

输出:

代码语言:javascript
复制
nvme0n1 40 C 40 C 43 C

请参见:man sed

票数 2
EN

Stack Overflow用户

发布于 2021-02-28 02:20:12

代码语言:javascript
复制
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;
    };
'

将输出:

代码语言:javascript
复制
40°C 40°C 43°C

sed是一个简单的正则表达式替换实用程序。例如,要在sed中减去两个数字,基本上必须生成所有可能的组合:

sed 's/1-1/0/; s/2-1/1/; s/3-1/2/; s/ ... all possible combinations of numbers ... '..。

要计算数字之间的差值,请使用awk..。

票数 2
EN

Stack Overflow用户

发布于 2021-03-01 02:41:11

另一种使用GNU的方法sed将会是

代码语言:javascript
复制
sed -E 's/^/\n/; :a; s/\n.*: ([0-9]+ C )$/\1/; s/\n.*//; $!{N; ba}'

此版本不使用保留缓冲区,但可能比使用它的版本效率低。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66401875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档