有人可以帮我写一个KSH脚本来计算AIX服务器中使用的内存百分比吗?
以下是我的要求
以下是已编写的示例脚本。
#!bin/ksh
echo $(
svmon -G | grep memory |
sed 's/ */ /g' |
cut -d" " -f 3
)/$(
svmon -G | grep memory |
sed 's/ */ /g' |
cut -d" " -f 2
)
我低于输出
4915483/ 7864320
但我需要将除法运算的结果作为输出
答案 0 :(得分:1)
awk
,nawk
*或mawk
更容易:
svmon() { [[ $1 == -G ]] || return
echo memory 7864320 4915483 junk
echo foo bar baz
echo
}
test_it() {
svmon -G | nawk '/memory/ {
print $3 / $2; exit
}'
} && test_it
此示例包含我们这些没有svmon的模拟函数。实际的解决方案是函数test_it
test_it() {
svmon -G | nawk -v OFMT="%.12f" '/memory/ {
print $3 / $2; exit
}'
} && test_it
使用OFMT提高精确度,请参阅nawk(1)
*
nawk
是 New Awk ,有时也被称为'one true awk'。这是1977年原版 awk 的1985年修订版(在此之后命名为oawk
)。 Nawk 是该语言的基本参考,其功能已被许多其他人采用。
答案 1 :(得分:0)
您可以获取命令的结果并将其传递到bc
:
echo "scale=16; 4915483/ 7864320" | bc
这导致
.6250359853108723
因此,在您的情况下,以下内容应该有效(编辑以显示乘以100 ):
echo "scale=16; 100 * " $(svmon -G | grep memory | sed 's/ */ /g' | cut -d" " -f 3)/$(svmon -G | grep memory | sed 's/ */ /g' | cut -d" " -f 2) | bc
我在100 *
之后添加了scale=16;
,因此您将结果乘以100。
您可以更改scale
因子以更改分区中的有效位数(默认情况下bc
适用于整数数学)。 16可能远远超过你需要的百分比,特别是在乘以100之后。试验直到得到你喜欢的东西。
**其他想法**我认为awk
是一个更好的工具。我的机器(Mac OS)上没有svmon
可用,但根据你写的内容,我认为我可以发现它产生了多行,其中一行中有memory
字。并且您想要计算两个字段的比率(似乎您将字段3除以字段2)。在awk中会是:
svmon -G | awk '{if($0 ~ /memory/) {printf("memory used: %.1f%%\n", 100.0 * $3 / $2)}}'
我认为它更紧凑......你可能需要调整它 - 我不确定我的场数是否合适。正如我所说,我没有svmon
。
再次更新
要在shell变量中获取结果,您可以获取整个命令并将其包装在$()
结构中,如下所示:
memPct=$(echo "scale=1; 100 * " $(svmon -G | grep memory | sed 's/ */ /g' | cut -d" " -f 3)/$(svmon -G | grep memory | sed 's/ */ /g' | cut -d" " -f 2) | bc)
echo $memPct "%"
会将百分比放在shell变量$memPct
中,然后用%
符号将其打印出来......
注意 - 您必须在此命令的第一部分中没有任何空格,否则它将无效。