No linux, como faço várias operações em uma única string através da tubulação?

1

Por exemplo,

Se você fizer free -m | sed -n 2p

Eu quero trabalhar com a saída do último , do segundo para o último e do terceiro colunas . O problema é que quero mantê-lo consistente e usar a saída de free uma vez.

Eu quero ser capaz de manter a saída consistente sem executar o free -m | sed -n 2p e extrair as três colunas que eu preciso três vezes; Eu quero ser capaz de fazer isso uma vez. Como posso fazer isso?

    
por user1529891 18.07.2012 / 17:54

4 respostas

3

Você pode querer dar Awk um turbilhão para isso.

[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
    
por 18.07.2012 / 18:02
1

Você pode usar pipes nomeados e awk para dividir a saída em 3 origens. Então você pode ler (uma vez) de cada fonte.

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

Os pipes nomeados pipe1 et al. agir como buffers que você pode ler como se fossem pipelines.

cat pipe1 | this | that | the-other

ou de preferência sem cat :

this < pipe1 | that | the-other

Observe que, depois de ler os dados de um canal, os dados desaparecem, como se sua entrada viesse de um canal comum.

    
por 18.07.2012 / 18:23
1

Acho que a maneira mais simples de fazer isso seria armazenar a linha de estatísticas em uma matriz bash e acessar os elementos da matriz:

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
    
por 18.07.2012 / 21:15
0

Optei por armazenar apenas o resultado free em uma variável e fazer eco de cada resultado individualmente.

Este é o meu resultado final:

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);
    
por 19.07.2012 / 05:27