printf를 사용하여 배열 출력 형식 지정

printf를 사용하여 배열 출력 형식 지정

각 네트워크 카드에 대한 세부 정보가 포함된 배열이 있습니다. 각 배열 인덱스는 공백으로 구분된 세 개의 값으로 구성됩니다.

나는 출력으로 멋진 테이블을 원합니다. 인덱스의 각 값에 형식 패턴을 할당하는 방법이 있습니까?

지금까지 이것이 내가 사용하고 있는 것입니다:

NIC_details[0]='wlp2s0 192.168.1.221 xx:xx:xx:xx:xx:xx'
NIC_details[1]='wwan0 none xx:xx:xx:xx:xx:xx'
NIC_details[2]='virbr0 192.168.122.1 00:00:00:00:00:00'

printf "%-20s\n" "${NIC_details[@]}"

$1, $2, $3 위치별로 배열 인덱스의 값에 액세스하고 해당 값이 공백으로 구분되어 있음을 알고 각 $X 위치에 대해 서식 지정 패턴을 적용하는 방법이 있나요?

나도 시도했다

echo "$i" | column -t

하지만 원하는 결과를 얻지는 못했습니다.

답변1

이미 수행 중인 작업을 약간 수정하면 다음과 같습니다.

set -f # to prevent filename expansion
for i in ${!NIC_index[@]}
do
  printf "%-20s" ${NIC_details[i]}
  printf "\n"
done

for모든 배열 인덱스를 반복하기 위해 루프를 추가했습니다 ${!NIC.... 이것이 구문 입니다. 숫자 배열이므로 인덱스를 직접 반복할 수도 있습니다.

참고로 저는 일부러 나갔습니다.${NIC_details[i]} 인용되지 않음이렇게 하면 쉘이 값을 구분하는 데 사용되는 공백으로 값을 분할하게 됩니다. printf따라서 3개의 값이 표시되고 각 값에 대해 %-20s 형식을 반복합니다. 그런 다음 각 네트워크 카드 뒤에 개행 문자를 추가하여 멋진 테이블을 만들었습니다.

set -f변수를 인용 해제하면 맨 위의 변수가 중요합니다. 그렇지 않으면 쉘이 개입하여 시도합니다.전반적인 상황따옴표가 없는 변수에 표시되는 와일드카드입니다.

예제 출력:

wlp2s0              192.168.1.221       xx:xx:xx:xx:xx:xx
wwan0               none                xx:xx:xx:xx:xx:xx
virbr0              192.168.122.1       00:00:00:00:00:00

답변2

예, 다음 과 같은 방법이 있습니다 awk.

echo ${NIC[0]} | awk '{ printf "%-10s %s\n", $1, $2 }'

또 다른 방법은 다양한 변수의 값을 가져온 다음 printfbash에서 작업을 수행하는 것입니다. 좋다:

var1=$(echo ${NIC[0]} | cut -d ' ' -f1)
var2=$(echo ${NIC[0]} | cut -d ' ' -f2)
var3=$(echo ${NIC[0]} | cut -d ' ' -f3)

printf$var1,2,3과 함께 사용됩니다.

관련 정보