如何将meminfo命令的输出存储到shell脚本中的变量

如何将meminfo命令的输出存储到shell脚本中的变量,shell,output,Shell,Output,嗨,亲爱的朋友们,我有一个shell脚本命令用于存储输出 /在一些变量中使用proc/meminfo命令,我想对这些变量求和 变量,但我只得到了这个结果kB+kB+kB,而代码没有 工作,有人能帮忙修理吗,谢谢 我只修改脚本以便它返回一些值。我不是一个专家,但我只是修复了我所能看到的错误。希望对你有用 numA=$(grep -m 1 "MemTotal" /proc/meminfo | awk '{ print $2 }') numB=$(grep -m 1 "MemFree" /proc/m

嗨,亲爱的朋友们,我有一个shell脚本命令用于存储输出 /在一些变量中使用proc/meminfo命令,我想对这些变量求和 变量,但我只得到了这个结果kB+kB+kB,而代码没有 工作,有人能帮忙修理吗,谢谢


我只修改脚本以便它返回一些值。我不是一个专家,但我只是修复了我所能看到的错误。希望对你有用

numA=$(grep -m 1 "MemTotal" /proc/meminfo | awk '{ print $2 }')
numB=$(grep -m 1 "MemFree" /proc/meminfo | awk '{ print $2 }')
numC=$(grep -m 1 "Buffers" /proc/meminfo | awk '{ print $2 }')
numD=$(grep -m 1 "Cached" /proc/meminfo | awk '{ print $2 }')

echo "-------------------"
echo $numA $numB $numC $numD
echo " ****--------------------"
numsum=$(($numB+$numC+$numD))
echo  "numsum =MemFree+Buffers+Cached=$numsum"
echo $numsum
numminus=$mumA-$numsum
echo  "numminus =MemTotal-(MemFree+Buffers+Cached)=$numminus"
numDivide=$numminus/$numA
echo  "numDivide =numminus/numA=$numsum"

整个过程应该是一个单独的Awk脚本。将每个字段提取到一个单独的shell变量,这样就可以使用shell臭名昭著的糟糕的算术工具,这简直是疯了。特别是,即使您在Bash中得到了一些算术(尽管语法与您尝试的不同),它仍然是整数;所以你的除法结果就是零

awk '/MemTotal/ && !memtotal { memtotal = $2 }
    /MemFree/ && !memfree { memfree = $3 }
    /Buffers/ &&!buffers { buffers = $4 }
    /Cached/ && !cached { cached = $5 }
    END (
        # Ugh, is this really necessary?
        print "-------------------"
        print memtotal, memfree, buffers, cached
        print " ****-------------------"
        numsum=memfree+buffers+cached
        print "numsum =MemFree+Buffers+Cached=" numsum
        numminus=memtotal-numsum
        print "numminus =MemTotal-(MemFree+Buffers+Cached)=" numminus
        numDivide=numminus/memtotal
        print  "numDivide =numminus/memtotal=" numDivide }' /proc/meminfo
如果其中一个值可能为零,则可能需要稍微不同的方法来提取第一个匹配

我重新命名了前四个变量;其他三个可能也会得到合理的名称,但我无法很快理解您希望计算的内容

捕获计算结果供以后使用的一种更惯用的方法是让Awk脚本只打印计算机可读的输出。下面的脚本包含丰富的注释——如果删除注释,可以将其缩减到更小,但我认为易读性和可维护性将胜过简洁性。顺便说一句,这也演示了“稍微不同的方法”,以确保始终获得变量的第一个值

memRatio=$(awk '# Populate an associative array with first occurrences
    /MemTotal/ && !("memtotal" in i) { i["memtotal"] = $2 }
    /MemFree/ && !("memfree" in i) { i["memfree"] = $3 }
    /Buffers/ && !("buffers" in i) { i["buffers"] = $4 }
    /Cached/ && !("cached" in i) { i["cached"] = $5 }
    # Have we collected all the keys for the array? Then print and quit
    ("memtotal" in i) && ("memfree" in i) && 
        ("buffers" in i) && ("cached" in i) {
            print (i["memtotal"]-i["memfree"]-i["buffers"]-i["cached"])/i["memtotal"]
            exit 0 # success
         }
    # If we fall through to here, we never captured the variables
    END { exit 1 }' /proc/meminfo)

虽然在我的系统中,所有这些值似乎都在
$2
中,而不是在连续增加的列中。在这种情况下,捕获代码可以稍微简化(对所有四个键使用一个正则表达式;对数组键使用正则表达式匹配,而不管大小写)。

感谢您的回答,实际上我想将Memtotal和MemFree以及buffers和cache存储在不同的变量中,然后执行此操作,Memtotal-(MemFree+buffers+cache)/MemTotal并将结果存储在一个变量中以在java程序中使用:)是否有任何特定的细节您仍然有问题?是的,实际上仍然有一个问题…在这一行echo numDivide=$numminus/$numA这一行显示的除法结果为零,但我知道根据numminus和numA,它将是0.123。我如何将这些数字除以数字,以显示点后的数字,并将0.123保存在变量中作为浮点数。谢谢Awk脚本取代了您的尝试。这里的代码不受shell的限制。
memRatio
中的值就是您要查找的结果。谢谢亲爱的朋友,但是当我使用“numDivide=numminus/numA=$numsum”时,结果是“0”。您知道问题出在哪里吗?我如何解决它?我修改后得到以下结果。我没有得到任何0。或者我错过了什么3948080 349836 158340 1237468*****--------------numsum=MemFree+Buffers+Cached=1745644 1745644 numminus=MemTotal-(MemFree+Buffers+Cached)=-1745644 numDivide=numminus/numA=1745644谢谢你我修好了:),Mt Totalmem是2837436,numsum是1781384,numminus是1056652,我用计算器计算除法,结果是,0.371,但是脚本显示的是零!!!您知道我应该如何更改除法命令,结果显示为0.371,ThanksBash只支持整数运算。请看我的答案,或者摆弄
bc
memRatio=$(awk '# Populate an associative array with first occurrences
    /MemTotal/ && !("memtotal" in i) { i["memtotal"] = $2 }
    /MemFree/ && !("memfree" in i) { i["memfree"] = $3 }
    /Buffers/ && !("buffers" in i) { i["buffers"] = $4 }
    /Cached/ && !("cached" in i) { i["cached"] = $5 }
    # Have we collected all the keys for the array? Then print and quit
    ("memtotal" in i) && ("memfree" in i) && 
        ("buffers" in i) && ("cached" in i) {
            print (i["memtotal"]-i["memfree"]-i["buffers"]-i["cached"])/i["memtotal"]
            exit 0 # success
         }
    # If we fall through to here, we never captured the variables
    END { exit 1 }' /proc/meminfo)