繁体   English   中英

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

[英]How to store output of meminfo command to a variable in shell script

嗨,亲爱的朋友们,我有一个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 $3 }')
numC=$(grep -m 1 "Buffers" /proc/meminfo | awk '{ print $4 }')
numD=$(grep -m 1 "Cached" /proc/meminfo | awk '{ print $5 }')
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"

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

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 ,而不是在连续增加的列中。 在这种情况下,捕获代码可以有所简化(对所有四个键使用单个正则表达式;对数组键不区分大小写,使用正则表达式匹配)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM