如何以正确的格式对齐脚本输出的列
How to align the column in proper format fot the script output
我有至少对我有用的脚本,但是填充或说它用于对齐或证明列的标记效果不佳,我正在努力为其找到最佳解决方案。
下面是基本上获取系统上的 Os Release version
和 Perl 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"
我有至少对我有用的脚本,但是填充或说它用于对齐或证明列的标记效果不佳,我正在努力为其找到最佳解决方案。
下面是基本上获取系统上的 Os Release version
和 Perl 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"