如何将一行分成多个字符?

如何将一行分成多个字符?

的输出w | head -1可以为我的机器提供 2 个不同的结果:

16:34:42 up 32 days,  3:02,  1 user,  load average: 0.14, 0.11, 0.07
14:10:55 up 32 days, 39 min, 1 user, load average: 0.07, 0.13, 0.09

我需要获得负载平均数(例如0.07, 0.13, 0.09)。如何按load average:字符串拆分行,以便始终可以获得两种情况的负载平均数?

答案1

您还可以使用 awk:

$ w | head -1 | awk '{print $10,$11,$12}'
0.80, 0.84, 0.93

或者,如果字段数量可变,请使用:

$ w | head -1 | awk '{print $(NF-2),$(NF-1),$NF}'
0.81, 0.82, 0.91

或者,更优雅(谢谢@Letitzia):

$ w | head -1 | awk -F "load average: " '{print $2}'

塞德:

$ w | head -1 | sed 's/.*load average: *//' 

珀尔:

$ w | head -1 | perl -pe 's/.*load average: *//' 

或者

$ w | head -1 | perl -lne '/.*load average: *(.*)/ && print $1' 

您实际上可以colrm在此处使用,但请注意,它删除了定义为“一行中的单个字符”的“列”。因此,虽然它适用于您提供的示例(因为有额外的空间),但如果列数进一步变化,它就不会起作用。此处,删除第 1 至 51 列

$ w | head -1 | colrm 1 51

答案2

通常我只会使用${parameter#word} bash参数扩展。它从一开始就扩展$parameter、删除word(可以是一个模式)。

在你的情况下,类似:

line=...
echo ${line#*load average: }

使其成为一个函数:

get_load() {
    w | head -n 1 | { read -r line; echo ${line#*load average: }; }
}

答案3

如果你只想要最后一个数字,你可以使用 grep:

$ w | grep -Po 'load average: \K.*'
0.07, 0.13, 0.09

答案4

其他perl

$ w | head -1 | perl -nle 'print +(split /load average:/)[-1]'
 0.42, 0.49, 0.63

相关内容