例如,
如果你free -m | sed -n 2p
我想使用最后的,倒数第二, 和第三列。问题是我想保持一致并使用一次的输出free
。
我希望能够保持输出一致,而无需运行free -m | sed -n 2p
并提取我需要的三列三次;我希望能够只做一次。我该怎么做?
答案1
您可能想尝试Awk
一下这个。
[root@james-ws tmp]# free -m | sed -n 2p
Mem: 3948 3724 223 0 364 852
[root@james-ws tmp]# free -m | sed -n 2p | awk '{print $7, $6, $3}'
852 364 3718
答案2
您可以使用命名管道并将awk
输出拆分为 3 个源。然后您可以从每个源读取(一次)。
mkfifo pipe1 pipe2 pipe3
free -m | sed -n 2p | awk '{ print $3 >> pipe1; print $6 >> pipe2; print $7 >> pipe3 }'
命名管道pipe1
等充当缓冲区,您可以像读取管道一样读取它们。
cat pipe1 | this | that | the-other
或最好没有cat
:
this < pipe1 | that | the-other
请注意,一旦从管道读取数据,数据就会消失,就像您的输入来自常规管道一样。
答案3
我认为最简单的方法是将统计信息行存储在 bash 数组中,然后访问数组的元素:
memStats=( $(free -m | sed -n 2p) )
memStatElements=${#memStats[@]}
echo "last column: ${memStats[memStatElements-1]}"
echo "second-to-last column: ${memStats[memStatElements-2]}"
echo "second column: ${memStats[1]}" # Note that arrays are 0-based, so [1] is the second element
答案4
我选择将free
结果存储在变量中并单独回显每个结果。
这是我的最终结果:
STRINGMEM=$(free -m | sed -n 2p | awk '{ print $7,$6,$3 }'); CACHED=$( echo $STRINGMEM | awk '{print $3}'); BUFFERED=$(echo $STRINGMEM | awk '{print $2}'); ACTIVE=$(echo $STRINGMEM | awk '{print $1}'); ACTIVE=$( (( ($BUFFERED + $CACHED) - $ACTIVE)) ); DATE=$(date +%s);