行を複数の文字で分割するにはどうすればよいでしょうか?

行を複数の文字で分割するにはどうすればよいでしょうか?

私のマシンでは、出力はw | head -12 つの異なる結果になります。

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

負荷平均数値 (例 ) を取得する必要があります。常に 2 つのケースの負荷平均数値を取得できるように、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 つの文字」として定義されている「列」を削除することに注意してください。したがって、提供された例では機能しますが (余分なスペースがあるため)、列の数がさらに変わると機能しません。ここでは、列 1 から 51 を削除します。

$ w | head -1 | colrm 1 51

答え2

通常は${parameter#word} bash パラメータ拡張. を拡張し$parameterword先頭から (パターンになる可能性がある) を削除します。

あなたの場合は次のようになります:

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

関連情報