여러 행의 변수를 열로 인쇄합니다.

여러 행의 변수를 열로 인쇄합니다.

클러스터에서 값을 수집하는 스크립트가 있습니다. 어떤 경우에는 이러한 값에 여러 행이 있습니다. 데이터 배치 방법을 지정하는 printf 형식이 있지만 여러 줄을 고려하지 않으므로 간격이 비뚤어집니다.

The data should look like this:

Service Group          AutoStart List          System List
foo                    sys1                    sys1
                       sys2                    sys2

대신 이렇게 생겼어요

Service Group          AutoStart List          System List
foo                    sys1                    
sys2                    sys1
sys2

자동 시작 목록과 시스템 목록은 동일해야 하지만 어느 쪽이든 값을 올바른 열에 강제로 적용하는 방법을 파악하지 못했습니다.

sgheader="\n\033[4m\033[1m%-30s %-30s %-15s\033[0m\033[0m"
sgformat="\n%-30s %-30s %-15s"



printf "${sgheader}" "Service Group" "Autostart List" "System List" 
printf "${sgformat}" "${svcgroup}" "${autostrtlist}" "${hosts}"

답변1

어쩌면 다음과 같은 것일 수도 있습니다.

svcgroup='foo' autostrtlist=$'sys1\nsys2' hosts=$'sys1\nsys2'
paste <(printf '%s\n' "$svcgroup") \
      <(printf '%s\n' "$autostrtlist") \
      <(printf '%s\n' "$hosts") | expand -t30

(ksh93/zsh/bash 구문). 또는 다음을 갖춘 시스템에서 POSIXly /dev/fd/x:

paste /dev/fd/3 3<<E3 /dev/fd/4 4<<E4 /dev/fd/5 5<<E5 | expand -t 30
$svcgroup
E3
$autostrtlist
E4
$hosts
E5

와는 별개로 dash,yash최신 버전과 마찬가지로 bash서브셸에서 제공하는 파이프 대신 임시 파일을 사용하므로 아마도 더 효율적일 것입니다(이식성이 더 높을 뿐만 아니라).

답변2

변수에서 새 줄을 제거할 수 있습니다.

var=$(echo "$var" | tr -d '\n')

답변3

매번 한 줄에 맞는다면 몇 가지 간단한 방법입니다. 요청한 대로 수행하려면 열을 올바르게 정렬하는 데 조금 더 노력이 필요합니다. 기본 아이디어는 다음과 같습니다.

#!/bin/bash

inputA="foo"
inputB=$'sys1\nsys2\n'
inputC=$'sys1\nsys2\n'

sgheader="\033[4m\033[1m%-30s %-30s %-15s\033[0m\033[0m\n"
sgformat="%-30s %-30s %-15s\n"

printf "${sgheader}" "Service Group" "Autostart List" "System List"

# This shows two simple ways to do this which use concatenation but
# require that the result still fit in the same space as is used for
# a single line
columnA="$inputA"
columnB=$(echo "$inputB"|awk '{printf("%s,",$0)}'|sed 's/,.\s*$//')
columnC=$(echo "$inputC"|tr '\n' ',')

printf "${sgformat}" "${columnA}" "${columnB}" "${columnC}"

# This is a version which outputs like originally asked. It is much harder
# to tweak the formatting of this version though.
pr -tm <(printf '%s\n' "$inputA") <(printf '%s\n' "$inputB") \
       <(printf '%s\n' "$inputC") | expand -t10

내가 알 수 있는 한, 원하는 방식으로 이 작업을 수행하는 가장 좋은 방법은 지저분한 것입니다. 그 후에도 출력을 더욱 구체화하여 올바르게 정렬할 수 있습니다.

관련 정보