Выходной массив Bash в таблице

Вам нужен источник (. ) файл, а не выполнение:

. env.sh

Когда вы выполняете сценарий, он запускается в подоболочке, и все экспортируемые параметры выходят из области видимости, как только (под) оболочка выходит, не затрагивая родительскую оболочку.

Когда вы источник его, параметры будут доступны в вызывающем сеансе. А также для дочерних процессов, поскольку вы экспортируете их.


Обратите внимание, что системной оболочкой по умолчанию ( sh ) для Ubuntu является тире , а не bash и gnome-terminal spawns bash в качестве интерактивной оболочки. При выполнении убедитесь, что shebang правильный и желаемый. Также, пока source -ing, шебанг не нужен, его можно отбросить.

2
21.09.2016, 15:19
3 ответа

Я перепробовал много вариаций и провел некоторые исследования. Следующий код отлично работает для меня:

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

Просто зацикливание через мой массив. Я использую sed, потому что у меня есть разделитель в моих значениях массива для их разделения. Но колонка была тем, что я искал.

0
27.01.2020, 21:56

Использование модуля Text :: ASCIITable perl (также поддерживает многострочные ячейки):

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[@]}"

Где WOUT_WWW и WITH_WWW массивы были построены как:

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

Что дает:

.---------------------------------------------------------------------.
| 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 |                                |
'-------------------+----------------+--------------------------------'
7
27.01.2020, 21:56
function printTable()
{
    local -r delimiter="${1}"
    local -r data="$(removeEmptyLines "${2}")"

    if [[ "${delimiter}" != '' && "$(isEmptyString "${data}")" = 'false' ]]
    then
        local -r numberOfLines="$(wc -l <<< "${data}")"

        if [[ "${numberOfLines}" -gt '0' ]]
        then
            local table=''
            local i=1

            for ((i = 1; i <= "${numberOfLines}"; i = i + 1))
            do
                local line=''
                line="$(sed "${i}q;d" <<< "${data}")"

                local numberOfColumns='0'
                numberOfColumns="$(awk -F "${delimiter}" '{print NF}' <<< "${line}")"

                # Add Line Delimiter

                if [[ "${i}" -eq '1' ]]
                then
                    table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
                fi

                # Add Header Or Body

                table="${table}\n"

                local j=1

                for ((j = 1; j <= "${numberOfColumns}"; j = j + 1))
                do
                    table="${table}$(printf '#| %s' "$(cut -d "${delimiter}" -f "${j}" <<< "${line}")")"
                done

                table="${table}#|\n"

                # Add Line Delimiter

                if [[ "${i}" -eq '1' ]] || [[ "${numberOfLines}" -gt '1' && "${i}" -eq "${numberOfLines}" ]]
                then
                    table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
                fi
            done

            if [[ "$(isEmptyString "${table}")" = 'false' ]]
            then
                echo -e "${table}" | column -s '#' -t | awk '/^\+/{gsub(" ", "-", $0)}1'
            fi
        fi
    fi
}

function removeEmptyLines()
{
    local -r content="${1}"

    echo -e "${content}" | sed '/^\s*$/d'
}

function repeatString()
{
    local -r string="${1}"
    local -r numberToRepeat="${2}"

    if [[ "${string}" != '' && "${numberToRepeat}" =~ ^[1-9][0-9]*$ ]]
    then
        local -r result="$(printf "%${numberToRepeat}s")"
        echo -e "${result// /${string}}"
    fi
}

function isEmptyString()
{
    local -r string="${1}"

    if [[ "$(trimString "${string}")" = '' ]]
    then
        echo 'true' && return 0
    fi

    echo 'false' && return 1
}

function trimString()
{
    local -r string="${1}"

    sed 's,^[[:blank:]]*,,' <<< "${string}" | sed 's,[[:blank:]]*$,,'
}

ОБРАЗЦЫ

$ cat data-1.txt
HEADER 1,HEADER 2,HEADER 3

$ printTable ',' "$(cat data-1.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+

$ cat data-2.txt
HEADER 1,HEADER 2,HEADER 3
data 1,data 2,data 3

$ printTable ',' "$(cat data-2.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+
| data 1    | data 2    | data 3    |
+-----------+-----------+-----------+

$ cat data-3.txt
HEADER 1,HEADER 2,HEADER 3
data 1,data 2,data 3
data 4,data 5,data 6

$ printTable ',' "$(cat data-3.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+
| data 1    | data 2    | data 3    |
| data 4    | data 5    | data 6    |
+-----------+-----------+-----------+

$ cat data-4.txt
HEADER
data

$ printTable ',' "$(cat data-4.txt)"
+---------+
| HEADER  |
+---------+
| data    |
+---------+

$ cat data-5.txt
HEADER

data 1

data 2

$ printTable ',' "$(cat data-5.txt)"
+---------+
| HEADER  |
+---------+
| data 1  |
| data 2  |
+---------+

ССЫЛКА LIB на:https://github.com/gdbtek/linux-cookbooks/blob/master/libraries/util.bash

0
27.01.2020, 21:56

Теги

Похожие вопросы