如何始终将top命令的输出作为流获取?

12 浏览
0 Comments

如何始终将top命令的输出作为流获取?

我想知道如何使用bash获取系统CPU使用率,并以百分比形式显示。例如,示例输出:57%。如果有多个核心,如果能计算出平均百分比就更好了。

0
0 Comments

问题的出现原因:在使用top命令时,输出的结果不一定是一条流式的输出,这可能会给后续对输出结果的处理造成困扰。

解决方法:使用mpstat命令来获取CPU使用率的输出,并通过cut或者grep命令来解析所需要的信息。具体的操作如下:

1. 首先安装sysstat包,可以使用以下命令进行安装:

sudo apt-get install sysstat

2. 使用mpstat命令获取CPU使用率的输出,可以使用以下命令:

mpstat

3. 使用grep命令找到"%idle"所在的行,并使用tail命令取出最后一行,可以使用以下命令:

mpstat | grep -A 5 "%idle" | tail -n 1

4. 使用awk命令以空格为分隔符,找到"%idle"所在的列,并计算出总的CPU使用率,可以使用以下命令:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 - $12}'

5. 可根据需要修改awk命令的参数,以达到所需的输出格式,例如:

mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'

6. 如果%idle所在的列不是第12列,可以根据实际情况修改awk命令的参数,例如:

mpstat | awk -F " " '{print (100 - $13)"%"}'

通过以上方法,可以得到一条流式的输出,方便后续的处理和分析。

0
0 Comments

问题:如何以一致的流的形式获取top命令的输出?

原因:top命令的输出格式在不同的系统上可能有所不同,导致解析输出结果时出现困难。

解决方法:

1. 使用命令top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}'来获取top命令的输出。这个命令在大多数情况下可以提供准确的结果。

2. 如果想要更准确的结果,可以使用top -bn2命令,但是这样会花费更长的时间。

3. 对于不同的系统,可能需要修改正则表达式来解析输出结果。例如,在某些系统中,正则表达式应该是"s/.*, ([0-9.]*)%.*/\1/"

4. 对于不同的系统,可以使用不同的命令来获取准确的CPU使用率。例如,在Fedora系统上可以使用top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'命令,在OSX系统上可以使用top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'命令,在Debian系统上可以使用mpstat 1 1 | grep 'Average' | awk '{ printf "CPU: %.0f%%", 100-$NF }'命令。

5. 可以尝试使用perl来获取CPU使用率:top -b -n2 -p 1|perl -lane 'if( /Cpu(s):\s+([\d\.]+)%us,\s+([\d\.]+)%sy/){$u=$1 + $2;}END{printf("%.1f%%\n", $u);}'

6. 如果想要获取CPU使用率的趋势,可以调整-bn-d的值来获取更多的样本点,例如top -b1000 -d0.2可以提供更密集的样本点。

7. 在处理输出结果时,需要考虑不同系统的语言环境对输出结果的影响。例如,对于使用英语语言环境的系统,输出结果可能是...nn%ni 96.22%id mm%wa ...,这时可以通过提取idle数值并将其从100中减去来获取CPU使用率。

8. 使用grep | sed | awk的组合命令时,可以简化为top -bn1 | awk '/Cpu\(s\):/ { print 100-$5 }'

9. 对于使用欧洲数字格式(如1,1代替1.1)的系统,可以使用top -bn1 | grep "Cpu(s)" | sed -r 's/\,([0-9]{1,2})\b/.\1/g' | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}'命令。

10. 如果希望查看所有核心的输出结果,可以添加-1参数:top -bn1 -1

11. 可以使用单个grep命令来获取CPU使用率:top -bn1 | grep -Po "[0-9.]*(?=( id,))" | awk '{print 100 - $1"%"}'

12. 如果输出结果中的idle时间为100%,可以使用awk -F , '/^%Cpu/{print 100-$4}'命令来获取正确的CPU使用率。

13. 可以使用top -bn1 | awk '/ id,/ { split($0, x, / id,/); print 100-x[1] "%" }'命令来简化解析输出结果的过程。

14. 如果输出结果中的逗号后没有空格,可以预处理输出结果以确保每个逗号后都有一个空格,然后重新解析结果。

尽管有多种方法可以获取top命令的输出,但是需要根据系统的不同和输出结果的格式进行相应的调整。

0