Сортировать файл по строкам и по научным номерам

Используйте printfдля форматирования вывода (, это также более переносимо, чемecho). Я бы также сохранил реальное значение управляющих последовательностей цветов вместо того, чтобы сохранять их в форме, требующей расширения на echo.

RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0) 
online="${GREEN}online$NC" offline="${RED}offline$NC"

ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"

%-15s— это спецификация формата, которая дополняет строки пробелами справа, так что длина (в числе символов в zshи fishи байтах в большинстве других оболочек/printf)для быть не менее 15.

$ printf '|%-4s|\n' a ab abc abcd abcde
|a   |
|ab  |
|abc |
|abcd|
|abcde|
 printf '|%4s|\n' a ab abc abcd abcde
|   a|
|  ab|
| abc|
|abcd|
|abcde|

С усечением:

$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
|   a|
|  ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a   |
|ab  |
|abc |
|abcd|
|abcd|

Другие утилиты для форматирования текста в столбцах включают POSIXexpand:

printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30

(здесь расширение символа TAB(\t)с позициями табуляции каждые 30 столбцов)

или BSDcolumnили POSIXpr:

printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2

(здесь вывод на 2 36 -столбцов шириной столбца (см. параметр -wдля изменения ширины страницы по умолчанию, равной 72 )).

или BSDrs:

{
   while...
      printf 'Network %s\n: %s\n' "$hostname" "$state"
   done
} | rs -e 0 2

(как и columnне начнет вывод, пока не прочитает весь ввод ).

или ГНУcolumns:

printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2

zshтакже имеет некоторые флаги расширения параметров для заполнения строки:${(l:15:)hostname}для заполнения слева и ${(r:15:)hostname}для заполнения справа (с усечением ). В расширении подсказки (, как в подсказках или в print -P, или как включено в расширении параметра с флагом )%, оно также поддерживает %F{green}для цветного вывода,так что вы можете сделать:

online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"

Или:

print -rP "Network ${(r:15:)hostname}: $online"

Хотя содержание $hostnameтогда также будет подвержено быстрому расширению, что могло бы представлять собой уязвимость внедрения команд, если бы содержимое $hostnameне было под вашим контролем (, как вhostname='%)

0
14.11.2019, 19:45
0 ответов

Теги

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