在列中打印多行变量

awr*_*eau 6 bash shell-script text-processing columns

我有一个从集群中收集值的脚本。在某些情况下,这些值具有多行。我有一个 printf 格式,它指定了数据应该如何定位,但是它没有考虑多行,因此间距是倾斜的。

The data should look like this:

Service Group          AutoStart List          System List
foo                    sys1                    sys1
                       sys2                    sys2
Run Code Online (Sandbox Code Playgroud)

相反,它看起来像这样

Service Group          AutoStart List          System List
foo                    sys1                    
sys2                    sys1
sys2
Run Code Online (Sandbox Code Playgroud)

AutoStart List 和 System List 应该是相同的,但是不管这个事实,我还没有想出如何将值强制到正确的列中。

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}"
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

也许是这样的:

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

(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
Run Code Online (Sandbox Code Playgroud)

除了dashyash最新版本的之外bash,它使用临时文件而不是由子 shell 提供的管道,因此可能更高效(除了更便携之外)。

  • 这可能需要一些解释。 (2认同)