Ajuda com formatação de saída do comando awk no script

0

Se eu executar este comando:

awk -F'[="]+' '/^(NAME|VERSION)=/{printf("%-17s: %s\n",$1,$2)}' /etc/os-release

de um terminal, posso recuperar isso:

NAME             : Debian GNU/Linux
VERSION          : 8 (jessie)

(observe a formatação / espaçamento). No entanto, quando tento atribuir isso comando para uma variável local e chamá-lo, como eu faço nesta função:

#!/bin/bash 

#### Display header message ####
# $1 - message

function write_header(){
    local h="$@"
    echo "------------------------------"
    echo "  ${h}"
    echo "------------------------------"
}

#### Get info about Operating System ####

function  os_info(){
    local namevers=$(awk -F'[="]+' '/^(NAME|VERSION)=/{printf("%-17s:    %s\n",$1,$2)}' /etc/os-release)
    write_header "System Info"
    echo "Operating System : $(uname --kernel-name)"               
    echo "Kernel Version   : $(uname --kernel-release)"             
    echo $namevers     
}

os_info

Minha formatação é desconfigurada (veja a saída após NAME):

------------------------------
System Info
------------------------------
Operating System : Linux
Kernel Version   : 3.16.0-4-amd64
NAME : Debian GNU/Linux VERSION : 8 (jessie)

Eu posso contornar o erro de formatação se livrando da variável local, e chamando o awk em linhas individuais como esta:

awk -F'[="]+' '/^(NAME)=/{printf("%-17s: %s\n",$1,$2)}'    /etc/os-release
awk -F'[="]+' '/^(VERSION)=/{printf("%-17s: %s\n",$1,$2)}' /etc/os-release

mas isso parece um pouco desajeitado e não segue a estrutura do roteiro maior que estou escrevendo. Alguma sugestão sobre como consertar isto?

Por favor, note: eu não posso usar o LSB module porque algumas máquinas que estou testando este script não tem esse pacote instalado. Além disso, as coisas precisam ser executadas sem privilégios elevados.

    
por marshki 10.12.2016 / 16:47

3 respostas

1

Ah, vejo o problema no script:

A variável está sendo dividida aqui:

echo $namevers

Para corrigir isso, faça:

printf '%s\n' "$namevers"

Aqui está a saída:

------------------------------
    System Info
------------------------------
Operating System : Linux
Kernel Version   : 3.16.0-4-amd64
NAME             : Debian GNU/Linux
VERSION          : 8 (jessie)
    
por 10.12.2016 / 17:12
0

Se entendi corretamente, isso deve produzir a saída desejada:

function  os_info(){
    write_header "System Info"
    echo "Operating System : $(uname --kernel-name)"               
    echo "Kernel Version   : $(uname --kernel-release)"             
    awk -F'[="]+' '/^(NAME|VERSION)=/{printf("%-17s:    %s\n",$1,$2)}' /etc/os-release
}

Se você realmente quiser usar uma variável, precisa citar para preservar a formatação:

echo "${namevers}"
    
por 10.12.2016 / 16:53
0

Embora essa resposta talvez não responda à sua pergunta diretamente sobre o awk kung-fu, você também pode usar apenas source the /etc/os-release e usar as variáveis imediatamente.

function  os_info() {
    . /etc/os-release
    write_header "System Info"
    echo "Operating System : $(uname --kernel-name)"               
    echo "Kernel Version   : $(uname --kernel-release)"             
    echo "NAME             : $NAME"
    echo "VERSION          : $VERSION"
}
    
por 10.12.2016 / 20:10