Bash - разделитель для резки поля с разным интервалом - PullRequest
0 голосов
/ 11 апреля 2020

Я разрезаю статистику использования ЦП в файле bash и представляю его в формате, из iostat есть несколько полей, но релевантны только пользователь, система и режим ожидания

, как показано ниже:

echo "" `iostat -c | awk 'NR==3' | cut -d '%' -f 1,2,4,7`
echo "" `iostat -c | awk 'NR==4' | cut -d '   ' -f 1,2,4,7`

текущий вывод выглядит следующим образом:

 avg-cpu: %user %system %idle
cut: the delimiter must be a single character
Try 'cut --help' for more information.

Когда я использую это, чтобы вырезать поля, он не работает со следующей строкой, потому что интервал отличается в пределах полей, как вы учитываете для этого, поскольку он допускает только один символ при вырезании разделителя?

вот команда выглядит при регулярном выполнении без форматирования:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.07    0.01    0.14    0.04    0.00   99.74

Ответы [ 3 ]

3 голосов
/ 11 апреля 2020

Вам не нужно писать это дважды, все, что вам нужно, это один awk:

iostat -c | awk 'NR==3{print $1,$2,$4,$7};NR==4{print $1,$3,$6}'
0 голосов
/ 11 апреля 2020

Аргумент -d команды cut принимает ' ' в качестве разделителя для одного или нескольких пробелов. Вы можете удалить ведущие пробелы, например, используя this . Следующая команда выдает 0.07 0.14 99.74 в качестве вывода:

echo "" `iostat -c | awk 'NR==4' | awk '{$1=$1};1' | cut -d' ' -f1,3,6`
0 голосов
/ 11 апреля 2020

Вы можете отформатировать вывод с помощью printf в awk и напечатать нужные поля:

 iostat -c | awk '/avg-cpu/{printf "%8s %8s %8s %8s\n", $1, $2, $4, $7; getline; printf "         %8s %8s %8s\n", $1, $3, $6}'
...