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

分享于 

3分钟阅读

电脑

  繁體 雙語

问题:

比如,

如果你做 free -m | sed -n 2p

我想处理上次 columns第三列。 问题是我想保持一致,并使用 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:

你可以使用 命名管道(Named Pipes) 和 Awk 将输出分成 3个源。 然后你可以从每个源读取( 一次)。


mkfifo pipe1 pipe2 pipe3


free -m | sed -n 2p | awk '{ print $3>> pipe1; print $6>> pipe2; print $7>> pipe3 }'



命名管道(Named Pipes) pipe1 等。 充当可以读取的缓冲区,就像它们是管道一样。


cat pipe1 | this | that | the-other



或者最好没有 cat:


this <pipe1 | that | the-other



注意,一旦从管道读取数据,数据就消失了,就好像输入来自常规管道一样。


回答 3:

我认为最简单的方法是将统计行存储在 bash array 中,然后访问 array的元素:


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 存储在变量中,并分别对每个结果进行 echo。

这是我的最终结果:


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);





str  SIN  String  Opera  PIP  Operation  
相关文章