bash скрипт для разбора определенного номера записи и поля из текстового файла? - PullRequest
1 голос
/ 25 июля 2011

Предполагая, что файл mpstat-log.txt приведен ниже, как я могу проанализировать результаты файла и получить поле% idle для первых 4 процессоров 0-3.Я предполагаю, что это работа для grep, sed, cut или awk, но у меня недостаточно опыта, чтобы знать, какие утилиты лучше всего использовать для этой работы.

#!/bin/bash

for cpuIndex in {0..3}
do
   # Get percent idle from line of specified  cpuIndex
   cpuPercentIdle= # How to get a desired line and space separated field number?
   # Can you do math in a bash script ?
   cpuPercentUsed=$((100 - $cpuPercentId))
   echo "CPU $cpuIndex : Idle=$cpuPercentIdle, Used=$cpuPercentUsed"
   done
done

Вывод сценария:

CPU 0 : Idle=45.18, Used=54.82
CPU 1 : Idle=96.33, Used=3.67
CPU 2 : Idle=95.65, Used=4.35
CPU 3 : Idle=72.09, Used=27.91

Файл: mpstat-log.txt

Average:     CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
Average:     all   10.95    0.00    0.42    0.00    0.04    0.25    0.00   88.34   1586.71
Average:       0   51.50    0.00    3.32    0.00    0.00    0.00    0.00   45.18      0.00
Average:       1    3.67    0.00    0.00    0.00    0.00    0.00    0.00   96.33      2.66
Average:       2    4.35    0.00    0.00    0.00    0.00    0.00    0.00   95.65      0.00
Average:       3   27.57    0.00    0.33    0.00    0.00    0.00    0.00   72.09    997.34
Average:       4    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00     10.96
Average:       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
Average:       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
Average:       7    0.00    0.00    0.00    0.00    0.00    1.67    0.00   98.33    575.75

Заранее благодарим за любые рекомендации и советы!

Ответы [ 3 ]

3 голосов
/ 25 июля 2011

Практически все инструменты, которые вы упоминаете, могут выполнять работу тем или иным способом.Вот один с awk ...

awk '{ if ( $2 <= 3 ) print $10; }' mpstat-log.txt

2 голосов
/ 25 июля 2011

Решение с использованием awk:

{ if($2 ~ /[0-3]/) {
    print $10
  }
}

дает:

$ awk -f t.awk input
45.18
96.33
95.65
72.09

В чистом виде, что-то вроде этого:

#!/bin/bash

while read -a ARRAY
do
    if [[ "${ARRAY[1]}" =~ [0-3] ]]; then
        echo ${ARRAY[9]}
    fi
done < input

дает:

45.18
96.33
95.65
72.09

Bash не может использовать арифметику с плавающей запятой, для этого вы можете использовать bc. Смотрите ссылку , чтобы узнать, как вы можете использовать bc, чтобы сделать математику за вас.

1 голос
/ 25 июля 2011
$ awk '$2~/^[0-3]$/ {printf "CPU %d : Idle=%.2f, Used=%.2f\n",$2,$10,100-$10}' mpstat-log.txt
CPU 0 : Idle=45.18, Used=54.82
CPU 1 : Idle=96.33, Used=3.67
CPU 2 : Idle=95.65, Used=4.35
CPU 3 : Idle=72.09, Used=27.91
...