형식 지정 스크립트의 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"
}

관련 정보