Home > Net >  How to align the column in proper format fot the script output
How to align the column in proper format fot the script output

Time:04-15

I have script which works for me at least but the padding or say it markers for aligning or justifying the columns are not working good and i'm struggling to get the best solutions for it.

Below is the script which basically gets the Os Release version and Perl version running on the system.

if you look at the Result section the outer lining or markers which i defined are getting destorted .

Script:

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

remote_connect() {
   target_host=$1
   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 |  s |\n" "$target_host" "$rhelInfo" "$perlInfo"
   else
     printf "|%-10s | %-13s |  s |\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 "$@"' --

Result:

|-----------------------------------------------------------------|
|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 |

Required:

|-----------------------------------------------------------------|
|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     |

please help me understand or get a better way of doing it.

CodePudding user response:

I'd suggest you don't try to start formatting until you have all the data at hand: each column should be as wide as the longest value in it.

Also, to make your code simpler, use column instead of the "fancy" table. I'm sure there's a utility that can draw ASCII table borders, but is it really necessary?

This version just prints comma-separated values from the ssh connections, then uses column to add the whitespace.

Note that I'm using a quoted heredoc for the code to send to the target host, which simplifies quoting.

#!/bin/bash

remote_connect() {
    target_host=$1
    if remote_data=$(
        ssh -i ssh_prod "root@${target_host}" -o StrictHostKeyChecking=no -o PasswordAuthentication=no <<'END_SSH'
            rhelInfo=$(awk 'END{print $7}' /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 

CodePudding user response:

You should use as simplistic as it could be, define your column alignment as per the requirement with the printf formatter..

try below, it should work , however i did not tested it.

#!/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=$1
   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"
  • Related