Bash Scripting: Imprimindo os dados da coluna na mesma linha

5

Eu escrevi um script bash para calcular o tamanho de um banco de dados PostgreSQL e imprimir a saída junto com a data em que o script foi executado em um arquivo de texto. O código de script é o seguinte:

#!/bin/bash
date +"%d:%m" >> dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('ddb'); "  | sed -n    
'3,3p' | numfmt --to=iec >>dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('dpkidb'); "  | sed  
-n '3,3p' | numfmt --to=iec >>dbdata.growth

O script produz a seguinte saída no formato mostrado abaixo

26:03
         134G
         4.4M
26:03
         134G
         4.4M

A questão para mim é que eu quero todas as três colunas na mesma linha. Como posso conseguir isso?

    
por Zama Ques 26.03.2014 / 07:25

4 respostas

4

Substitua todas as linhas de saída, como:

date +"%d:%m" >> dbdata.growth

com linhas como:

date +"%d:%m" | tr -d $'\n' >> dbdata.growth

Isso usa tr para excluir caracteres de nova linha antes que eles sejam colocados no arquivo de saída.

tr é um utilitário de conversão ou exclusão. Nesse caso, o uso da opção -d diz para excluir. O caractere que pedimos para excluir é o caractere de nova linha, expresso como $'\n' .

    
por 26.03.2014 / 07:32
2

A solução seria usar subshells:

#!/bin/bash
var1=$(date +"%d:%m")
var2=$(psql -h 192.168.2.173 -U postgres -c "select pg_database_size('ddb'); "  | sed -n '3,3p' | numfmt --to=iec)
var3=$(psql -h 192.168.2.173 -U postgres -c "select pg_database_size('dpkidb'); "  | sed  -n '3,3p' | numfmt --to=iec )
echo $var1 $var2 $var3 >>dbdata.growth
    
por 26.03.2014 / 07:33
0

Se você sabe que existem três colunas, você pode usar colar:

your_script.sh | paste - - -
    
por 26.03.2014 / 13:31
0
#!/bin/bash
{ date +"%d:%m" >> dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('ddb'); "  | sed -n    
'3,3p' | numfmt --to=iec >>dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('dpkidb'); "  | sed  
-n '3,3p' | numfmt --to=iec >>dbdata.growth

} | ( 

#all output from your commands above piped to collector subshell below

set -f ; unset IFS ; set -- $(cat)
while [ $# -ge 3 ] ; do {
    printf '%s\t%s\t%s\n' "$1" "$2" "$3"
    shift 3 ; } ; done  
printf '%s\t' "$@"
)
    
por 26.03.2014 / 09:59