Alinhar saída de comando em colunas

1

Eu tenho a seguinte saída do meu script:

panos@panos:~/scripts> ./list_packages openSUSE-2016-254
zypper-aptitude.noarch : 1.12.23-1.1 update needed
zypper-log.noarch : 1.12.23-1.1 update needed
libsolv-debugsource : None not installed
libsolv-demo : None not installed
libsolv-demo-debuginfo : None not installed
libsolv-devel : None not installed
libsolv-devel-debuginfo : None not installed
libsolv-tools : 0.6.14-1.1 update needed
libsolv-tools-debuginfo : None not installed
perl-solv : None not installed
perl-solv-debuginfo : None not installed
python-solv : 0.6.14-1.1 update needed
python-solv-debuginfo : None not installed
ruby-solv : None not installed
ruby-solv-debuginfo : None not installed
libzypp : 15.19.5-1.1 update needed
libzypp-debuginfo : None not installed
libzypp-debugsource : None not installed
libzypp-devel : None not installed
libzypp-devel-doc : None not installed
zypper : 1.12.23-1.1 update needed
zypper-debuginfo : None not installed
zypper-debugsource : None not installed

A saída é gerada com base em algumas instruções if-else. Deixe-me dar-lhe os três comandos de eco usados no meu código-fonte:

echo "$pkg : $pkg_version update needed"
echo "$pkg : $new_version updated"
echo "$pkg : None not installed"

Meu problema é que eles gostariam que eles estivessem em colunas, algo como:

$pkg\t$pkg_version\t$message

Mas, como alguns nomes de pacote têm > 8 caracteres de comprimento, toda a coisa 'tab' fica feia. Alguma sugestão?

    
por drpaneas 23.02.2016 / 16:37

2 respostas

5

Existem duas maneiras:

  1. Use a função bash ' printf para imprimir e formatar sua saída (em vez de echo )
  2. Use o comando column -s : -t

./list_packages openSUSE-2016-254 | column -s : -t 
zypper-aptitude.noarch     1.12.23-1.1 update needed
zypper-log.noarch          1.12.23-1.1 update needed
libsolv-debugsource        None not installed
libsolv-demo               None not installed
libsolv-demo-debuginfo     None not installed
libsolv-devel              None not installed
libsolv-devel-debuginfo    None not installed
libsolv-tools              0.6.14-1.1 update needed
libsolv-tools-debuginfo    None not installed
perl-solv                  None not installed
perl-solv-debuginfo        None not installed
python-solv                0.6.14-1.1 update needed
python-solv-debuginfo      None not installed
ruby-solv                  None not installed
ruby-solv-debuginfo        None not installed
libzypp                    15.19.5-1.1 update needed
libzypp-debuginfo          None not installed
libzypp-debugsource        None not installed
libzypp-devel              None not installed
libzypp-devel-doc          None not installed
zypper                     1.12.23-1.1 update needed
zypper-debuginfo           None not installed
zypper-debugsource         None not installed

    
por 23.02.2016 / 16:54
0

Você pode usar algo como: while read -r arg1 arg2; do awk '{print "package: $arg1 version: $arg1}';done < input file

Portanto, a idéia é que arg1 sempre será a primeira palavra na linha, arg2 será a segunda, etc. Você pode usar if grep etc para alcançar o objetivo desejado. Espero que ajude!

    
por 23.02.2016 / 16:51