열에 여러 줄 변수 인쇄

열에 여러 줄 변수 인쇄

클러스터에서 값을 수집하는 스크립트가 있습니다. 어떤 경우에는 값에 여러 줄이 있습니다. 데이터 배치 방법을 지정하는 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

AutoStart 목록과 시스템 목록은 동일해야 하지만 그 사실에 관계없이 값을 올바른 열에 강제로 적용하는 방법을 찾지 못했습니다.

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

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

관련 정보