no debian que tenho na minha frente agora, free -t mostra uma Total: row:
total used free shared buffers cached
Mem: 8197980 2583348 5614632 0 222508 1904352
-/+ buffers/cache: 456488 7741492
Swap: 7807584 0 7807584
Total: 16005564 2550180 13455384
Se você precisar dessa linha, poderá usar tail e awk para obter os valores.
No entanto, se o seu free não mostrar essa linha, você poderá usar o awk com RS="" para unir as linhas:
free | awk -v RS="" '{print $10 "+" $17 "+" $21}' | bc
Se o layout da coluna do seu free for diferente do meu, talvez você precise mexer nos números dos campos.
Explicação:
O campo RS é o separador de registro. Configurar isso para "" une todas as linhas na saída de livre, então awk pode referenciá-las como se estivessem em uma 'linha'.
Contando desde o início, $1 to $6 são os cabeçalhos da coluna, $7 é o Mem: cabeçalho da linha, $8 to $10 são os valores nessa linha ... Portanto $10 é o valor de memória livre. Isso é feito de maneira semelhante para os seguintes valores:
total used free shared buffers cached
Mem: $8 $9 $10 $11 $12 $13
-/+ buffers/cache: $16 $17
Swap: $19 $20 $21
O comando awk {print $10 "+" $17 "+" $21} basicamente une esses valores com + entre e a saída é canalizada para bc para calcular a soma.