bash脚本从文本文件中解析特定的记录号和字段?

时间:2011-07-25 17:14:01

标签: parsing bash field

假设下面是mpstat-log.txt文件,我该如何解析文件的结果并获得前4个CPU 0-3的%idle字段。我的猜测是这是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 个答案:

答案 0 :(得分:3)

几乎所有你提到的工具都能以这种或那种方式完成工作。这是一个有awk ...

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

答案 1 :(得分:2)

使用awk的解决方案:

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

给出:

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

在纯粹的bash中,或许是这样的事情:

#!/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为您进行数学运算,请参阅此link

答案 2 :(得分:1)

$ 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