在 Linux 中,如何通过管道对单个字符串执行多个操作?

在 Linux 中,如何通过管道对单个字符串执行多个操作?

例如,

如果你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);

相关内容