Bash output array en la tabla

Soy bastante nuevo en Bash y estoy tratando de aprender creando algunos pequeños guiones.

Creé un pequeño script para search la input de DNS para varios dominios al mismo time. Los dominios se dan como attributes.

COUNTER=0 DOMAINS=() for domain in "$@" do WOUT_WWW=$(dig "$domain" +short) if (( $(grep -c . <<<"$WOUT_WWW") > 1 )); then WOUT_WWW="${WOUT_WWW##*$'\n'}" ; fi WITH_WWW=$(dig "www.${domain}" +short) if (( $(grep -c . <<<"$WITH_WWW") > 1 )); then WITH_WWW="${WITH_WWW##*$'\n'}" ; fi DOMAINS[$COUNTER]="$domain|$WOUT_WWW|$WITH_WWW" COUNTER=$(($COUNTER+1)) done 

Ahora solo quiero recorrer la nueva matriz "multidimensional" y dar el resultado como la tabla mysql:

 +------------------------------+ | Row 1 | Row 2 | Row 3 | +------------------------------+ | Value | Value | Value | +------------------------------+ 

¿Cómo puedo hacer eso?

Related of "Bash output array en la tabla"

Uso del module Text::ASCIITable (también admite celdas de varias líneas):

 print_table() { perl -MText::ASCIITable -e ' $t = Text::ASCIITable->new({drawRowLine => 1}); while (defined($c = shift @ARGV) and $c ne "--") { push @header, $c; $cols++ } $t->setCols(@header); $rows = @ARGV / $cols; for ($i = 0; $i < $rows; $i++) { for ($j = 0; $j < $cols; $j++) { $cell[$i][$j] = $ARGV[$j * $rows + $i] } } $t->addRow(\@cell); print $t' -- "$@" } print_table Domain 'Without WWW' 'With WWW' -- \ "$@" "${WOUT_WWW[@]}" "${WITH_WWW[@]}" 

Donde las matrices WOUT_WWW y WITH_WWW se han construido como:

 for domain do WOUT_WWW+=("$(dig +short "$domain")") WITH_WWW+=("$(dig +short "www.$domain")") done 

Lo que da:

 .---------------------------------------------------------------------. | Domain | Without WWW | With WWW | +-------------------+----------------+--------------------------------+ | google.com | 216.58.208.142 | 74.125.206.147 | | | | 74.125.206.104 | | | | 74.125.206.106 | | | | 74.125.206.105 | | | | 74.125.206.103 | | | | 74.125.206.99 | +-------------------+----------------+--------------------------------+ | stackexchange.com | 151.101.65.69 | stackexchange.com. | | | 151.101.1.69 | 151.101.1.69 | | | 151.101.193.69 | 151.101.193.69 | | | 151.101.129.69 | 151.101.129.69 | | | | 151.101.65.69 | +-------------------+----------------+--------------------------------+ | linux.com | 151.101.193.5 | n.ssl.fastly.net. | | | 151.101.65.5 | prod.n.ssl.us-eu.fastlylb.net. | | | 151.101.1.5 | 151.101.61.5 | | | 151.101.129.5 | | '-------------------+----------------+--------------------------------' 

Intenté muchas variaciones e hice algunas investigaciones. El siguiente código funciona bien para mí:

 for DOMAIN in "${DOMAINS[@]}"; do printf "%-8s\n" "${DOMAIN}" done | sed -e 's/|/_|g' | column -t -s '_' | awk '1;! (NR%1){print "---------";}' 

Solo recorriendo mi matriz. Estoy usando sed porque tengo un delimitador en mis valores de matriz para dividirlos. Pero la column era eso lo que estaba buscando.