格式化脚本中 awk 命令的输出

格式化脚本中 awk 命令的输出

如果我运行这个命令:

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

从终端,我可以检索:

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

(注意格式/间距)。但是,当我尝试将此命令分配给局部变量并调用它时,正如我在此函数中所做的那样:

#!/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

我的格式被破坏了(请参阅 NAME 之后的输出):

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

我可以通过删除局部变量并在单独的行上调用 awk 来解决格式错误,如下所示:

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

但这看起来有点笨重,并且不符合我正在编写的较大脚本的结构。对于如何解决这个问题,有任何的建议吗?

请注意:我无法使用,LSB module因为我正在测试此脚本的某些机器没有安装该软件包。此外,事情需要在没有提升权限的情况下运行。

答案1

啊,我在脚本中看到了问题:

变量在这里被分割:

echo $namevers

要修复它,请执行以下操作:

printf '%s\n' "$namevers"

这是输出:

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

答案2

如果我理解正确,这应该会产生您想要的输出:

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
}

如果您确实想使用变量,则需要引用它以保留格式:

echo "${namevers}"

答案3

虽然这个答案可能无法直接回答您有关awk功夫的问题,但您也可以source立即/etc/os-release使用变量。

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"
}

相关内容