如何以正确的格式对齐脚本输出的列

How to align the column in proper format fot the script output

我有至少对我有用的脚本,但是填充或说它用于对齐或证明列的标记效果不佳,我正在努力为其找到最佳解决方案。

下面是基本上获取系统上的 Os Release versionPerl version 运行 的脚本。

如果您查看“结果”部分,我定义的外衬或标记正在变形。

脚本:

#!/bin/bash
printf "\n"
marker=$(printf "%0.s-" {1..65})
printf "|$marker|\n"
printf "|%-10s | %-13s | %29s |\n" "Hostname" "RedHat Vesrion" "Perl Version"
printf "|$marker|\n"

remote_connect() {
   target_host=
   marker=$(printf "%0.s-" {1..65})
   remote_data=($(
   ssh -i ssh_prod "root@${target_host}" -o StrictHostKeyChecking=no -o PasswordAuthentication=no "
        rhelInfo=$(cat /etc/redhat-release | awk 'END{print $7}')
        perlInfo=$(rpm -qa | grep -i mod_perl)
        echo $rhelInfo $perlInfo
                "))

   rhelInfo=${remote_data[0]}
   perlInfo=${remote_data[1]}

   if [[ $? -eq 0 ]]
   then
     printf "|%-10s | %-13s | %20s |\n" "$target_host" "$rhelInfo" "$perlInfo"
   else
     printf "|%-10s | %-13s | %20s |\n" "$target_host" "Unable to get the ssh connection"
fi
}  2>/dev/null
export -f remote_connect
< CVE-2011-2767-hostsList.txt  xargs -P30 -n1 -d'\n' bash -c 'remote_connect "$@"' --

结果:

|-----------------------------------------------------------------|
|Hostname   | RedHat Vesrion |                  Perl Version |
|-----------------------------------------------------------------|
|fsx9015    |               |                      |
|fsx1258    |               |                      |
|fsx1195    |               |                      |
|fsx1063    |               |                      |
|fsx1241    | 6.9           | mod_perl-2.0.4-12.el6_10.x86_64 |
|fsx1242    | 6.9           | mod_perl-2.0.4-12.el6_10.x86_64 |
|fsx1210    | 6.7           | mod_perl-2.0.4-12.el6_10.x86_64 |
|fsx1484    | 6.9           | mod_perl-2.0.4-12.el6_10.x86_64 |

必填:

|-----------------------------------------------------------------|
|Hostname   | RedHat Vesrion|                  Perl Version       |
|-----------------------------------------------------------------|
|fsx9015    |               |                                     |
|fsx1258    |               |                                     |
|fsx1195    |               |                                     |
|fsx1063    |               |                                     |
|fsx1241    | 6.9           | mod_perl-2.0.4-12.el6_10.x86_64     |
|fsx1242    | 6.9           | mod_perl-2.0.4-12.el6_10.x86_64     |
|fsx1210    | 6.7           | mod_perl-2.0.4-12.el6_10.x86_64     |
|fsx1484    | 6.9           | mod_perl-2.0.4-12.el6_10.x86_64     |

请帮助我理解或获得更好的方法。

我建议您在准备好所有数据之前不要尝试开始格式化:每列的宽度应与其中最长的值一样宽。

此外,为了使您的代码更简单,请使用 column 而不是“花哨的”table。我确定有一个实用程序可以绘制 ASCII table 边框,但真的有必要吗?

此版本仅打印来自 ssh 连接的 comma-separated 值,然后使用 column 添加空格。

请注意,我使用引用的 heredoc 将代码发送到目标主机,这简化了引用。

#!/bin/bash

remote_connect() {
    target_host=
    if remote_data=$(
        ssh -i ssh_prod "root@${target_host}" -o StrictHostKeyChecking=no -o PasswordAuthentication=no <<'END_SSH'
            rhelInfo=$(awk 'END{print }' /etc/redhat-release)
            perlInfo=$(rpm -qa | grep -i mod_perl)
            echo "$rhelInfo,$perlInfo"
END_SSH
    )
    then
        echo "${target_host},${remote_data}"
    else
        echo "${target_host},?,?"
    fi
}  2>/dev/null

export -f remote_connect

{
    echo "Hostname,RedHat Version,Perl Version"
    < CVE-2011-2767-hostsList.txt  xargs -P30 -n1 -d'\n' bash -c 'remote_connect "$@"' --
} | column -s"," -t 

您应该尽可能简单地使用,根据 printf 格式化程序的要求定义您的列对齐方式..

在下面尝试,它应该可以工作,但是我没有测试它。

#!/bin/bash
###########
printf "\n"
marker=$(printf "%0.s-" {1..73})
printf "|$marker|\n"
printf "| %-15s | %-15s | %-35s |\n"  "Hostname" "RedHat Vesrion" "Perl Version"
printf "|$marker|\n"

remote_connect() {
   target_host=
   remote_data=($(
   ssh -i /home/nxf59093/.ssh/ssh_prod "root@${target_host}" -o StrictHostKeyChecking=no -o PasswordAuthentication=no "
        rhelInfo=$(cat /etc/redhat-release | awk 'END{print $7}')
        perlInfo=$(rpm -qa | grep -i mod_perl)
        echo $rhelInfo $perlInfo
                "))

   rhelInfo=${remote_data[0]}
   perlInfo=${remote_data[1]}

   if [[ $? -eq 0 ]]
   then
     printf "| %-15s | %-15s | %-35s |\n" "$target_host" "$rhelInfo" "$perlInfo"
   else
     printf "| %-15s | %-15s | %-35s |\n" "$target_host" "?" "?"
fi
}  2>/dev/null
export -f remote_connect
< CVE-2011-2767-hostsList.txt  xargs -P15 -n1 -d'\n' bash -c 'remote_connect "$@"' --
printf "|$marker|\n"