Заполнение символов в printf - PullRequest
94 голосов
/ 10 декабря 2010

Я пишу скрипт оболочки bash для отображения, запущен процесс или нет.

Пока я получил это:

printf "%-50s %s\n" $PROC_NAME [UP]

Код дает мне такой вывод:

JBoss                                              [DOWN]

GlassFish                                          [UP]

verylongprocessname                                [UP]

Я хочу заполнить пробел между двумя полями с помощью '-' или '*', чтобы сделать его более читабельным. Как мне это сделать, не нарушая выравнивания полей?

Вывод, который я хочу получить:

JBoss -------------------------------------------  [DOWN]

GlassFish ---------------------------------------  [UP]

verylongprocessname -----------------------------  [UP]

Ответы [ 13 ]

1 голос
/ 03 февраля 2019

Простой, но он работает:

printf "%-50s%s\n" "$PROC_NAME~" "~[$STATUS]" | tr ' ~' '- '

Пример использования:

while read PROC_NAME STATUS; do  
    printf "%-50s%s\n" "$PROC_NAME~" "~[$STATUS]" | tr ' ~' '- '
done << EOT 
JBoss DOWN
GlassFish UP
VeryLongProcessName UP
EOT

Вывод на стандартный вывод:

JBoss -------------------------------------------- [DOWN]
GlassFish ---------------------------------------- [UP]
VeryLongProcessName ------------------------------ [UP]
1 голос
/ 19 октября 2018

Простой консольный диапазон / заполнение / заполнение / заполнение с автоматическим масштабированием / изменением размера. Метод и пример.

function create-console-spanner() {
    # 1: left-side-text, 2: right-side-text
    local spanner="";
    eval printf -v spanner \'"%0.1s"\' "-"{1..$[$(tput cols)- 2 - ${#1} - ${#2}]}
    printf "%s %s %s" "$1" "$spanner" "$2";
}

Пример: create-console-spanner "loading graphics module" "[success]"

Теперь представляет собой полнофункциональный цветной набор символов-терминалов , который делает все, что касается печати строки с форматированным цветом и стилем с помощью гаечного ключа.

# Author: Triston J. Taylor <pc.wiz.tt@gmail.com>
# Date: Friday, October 19th, 2018
# License: OPEN-SOURCE/ANY (NO-PRODUCT-LIABILITY OR WARRANTIES)
# Title: paint.sh
# Description: color character terminal driver/controller/suite

declare -A PAINT=([none]=`tput sgr0` [bold]=`tput bold` [black]=`tput setaf 0` [red]=`tput setaf 1` [green]=`tput setaf 2` [yellow]=`tput setaf 3` [blue]=`tput setaf 4` [magenta]=`tput setaf 5` [cyan]=`tput setaf 6` [white]=`tput setaf 7`);

declare -i PAINT_ACTIVE=1;

function paint-replace() {
    local contents=$(cat)
    echo "${contents//$1/$2}"
}

source <(cat <<EOF
function paint-activate() {
    echo "\$@" | $(for k in ${!PAINT[@]}; do echo -n paint-replace \"\&$k\;\" \"\${PAINT[$k]}\" \|; done) cat;
}
EOF
)

source <(cat <<EOF
function paint-deactivate(){
    echo "\$@" | $(for k in ${!PAINT[@]}; do echo -n paint-replace \"\&$k\;\" \"\" \|; done) cat;    
}
EOF
)

function paint-get-spanner() {
    (( $# == 0 )) && set -- - 0;
    declare -i l=$(( `tput cols` - ${2}))
    eval printf \'"%0.1s"\' "${1:0:1}"{1..$l}
}

function paint-span() {
    local left_format=$1 right_format=$3
    local left_length=$(paint-format -l "$left_format") right_length=$(paint-format -l "$right_format")
    paint-format "$left_format";
    paint-get-spanner "$2" $(( left_length + right_length));
    paint-format "$right_format";
}

function paint-format() {
    local VAR="" OPTIONS='';
    local -i MODE=0 PRINT_FILE=0 PRINT_VAR=1 PRINT_SIZE=2;
    while [[ "${1:0:2}" =~ ^-[vl]$ ]]; do
        if [[ "$1" == "-v" ]]; then OPTIONS=" -v $2"; MODE=$PRINT_VAR; shift 2; continue; fi;
        if [[ "$1" == "-l" ]]; then OPTIONS=" -v VAR"; MODE=$PRINT_SIZE; shift 1; continue; fi;
    done;
    OPTIONS+=" --"
    local format="$1"; shift;
    if (( MODE != PRINT_SIZE && PAINT_ACTIVE )); then
        format=$(paint-activate "$format&none;")
    else
        format=$(paint-deactivate "$format")
    fi
    printf $OPTIONS "${format}" "$@";
    (( MODE == PRINT_SIZE )) && printf "%i\n" "${#VAR}" || true;
}

function paint-show-pallette() {
    local -i PAINT_ACTIVE=1
    paint-format "Normal: &red;red &green;green &blue;blue &magenta;magenta &yellow;yellow &cyan;cyan &white;white &black;black\n";
    paint-format "  Bold: &bold;&red;red &green;green &blue;blue &magenta;magenta &yellow;yellow &cyan;cyan &white;white &black;black\n";
}

Чтобы напечатать цвет , это достаточно просто: paint-format "&red;This is %s\n" red И, возможно, вы захотите получить жирный шрифт позже: paint-format "&bold;%s!\n" WOW

Опция -l для функции paint-format измеряеттекст, чтобы вы могли выполнять операции с метрикой шрифта консоли.

Опция -v для функции paint-format работает так же, как printf, но не может поставляться с -l

Теперь для охвата !

paint-span "hello " . " &blue;world" [примечание: мы не добавили последовательность терминала новой строки, но текст заполняет терминал, поэтому следующая строка выглядит только как последовательность терминала новой строки]

, и на выходе получается:

hello ............................. world

0 голосов
/ 30 октября 2018

Bash + seq, чтобы разрешить расширение параметра

Аналогично ответу @Dennis Williamson, но если доступно seq, длину строки пэда не нужно жестко кодировать. Следующий код позволяет передавать переменную в скрипт в качестве позиционного параметра:

COLUMNS="${COLUMNS:=80}"
padlength="${1:-$COLUMNS}"
pad=$(printf '\x2D%.0s' $(seq "$padlength") )

string2='bbbbbbb'
for string1 in a aa aaaa aaaaaaaa
do
     printf '%s' "$string1"
     printf '%*.*s' 0 $(("$padlength" - "${#string1}" - "${#string2}" )) "$pad"
     printf '%s\n' "$string2"
     string2=${string2:1}
done

Код ASCII "2D" используется вместо символа "-", чтобы избежать интерпретации оболочкой его как флага команды. Другой вариант - «3D» для использования «=».

Если длина аргумента не указана в качестве аргумента, в приведенном выше коде по умолчанию используется стандартная ширина терминала 80 символов.

Чтобы воспользоваться преимуществом переменной оболочки bash COLUMNS (т. Е. Шириной текущего терминала), переменная окружения должна быть доступна сценарию. Одним из способов является получение всех переменных среды путем выполнения сценария, которому предшествует . (команда «точка»), например:

. /path/to/script

или (лучше) явно передать переменную COLUMNS при выполнении, например:

/path/to/script $COLUMNS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...