Как разделить строку по нескольким символам?

Как разделить строку по нескольким символам?

Вывод 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

Связанный контент