如何始终将top命令的输出作为流获取?
问题的出现原因:在使用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)"%"}'
通过以上方法,可以得到一条流式的输出,方便后续的处理和分析。
问题:如何以一致的流的形式获取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命令的输出,但是需要根据系统的不同和输出结果的格式进行相应的调整。