需要帮助编写示例Unix脚本来执行2个命令输出的划分

时间:2014-02-22 19:29:30

标签: scripting ksh

有人可以帮我写一个KSH脚本来计算AIX服务器中使用的内存百分比吗?

以下是我的要求

  1. 我希望我的脚本执行svmon -G命令,我的脚本应该删除前2个值
  2. 我的脚本应该将第3个值除以第1个值,结果应该乘以100以获得所用内存的百分比。
  3. 以下是已编写的示例脚本。

    #!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
    

    但我需要将除法运算的结果作为输出

2 个答案:

答案 0 :(得分:1)

awknawk *或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中,然后用%符号将其打印出来......

注意 - 您必须在此命令的第一部分中没有任何空格,否则它将无效。