Подтвердить что ты не робот

Как напечатать текст в bash и поместить его в пробелы до определенной ширины?

Я повторяю некоторый текст в bash script с переменной в нем и хочу наложить эту переменную, чтобы у нее всегда было подходящее количество пробелов справа, чтобы сохранить остальную часть текста в выровненном.

Вот пример того, что я хочу:

Echoing random number 1080    [ OK ]
Echoing random number 443     [ OK ]
Echoing random number 34842   [ OK ]

Числовое значение будет иметь разную длину (вероятно, не более 5 или 6 цифр).

Я знаю, что printf может это сделать и правильно выровнять переменную, выполнив следующие действия:

printf "Echoing random number %5s   [ OK ]" $RAND_NUM

Однако это форматирует текст следующим образом:

Echoing random number  1080   [ OK ]
Echoing random number   443   [ OK ]
Echoing random number 34842   [ OK ]

И, конечно, просто эхо с пробелами не работает:

echo "Echoing random number ${RAND_NUM}   [ OK ]"

Производит следующее:

Echoing random number 1080   [ OK ]
Echoing random number 443   [ OK ]
Echoing random number 34842   [ OK ]

Есть ли способ распечатать текст, как мой первый пример?

4b9b3361

Ответ 1

Используйте - для выравнивания поля слева.

printf "Echoing random number %-5s   [ OK ]" $RAND_NUM

В качестве альтернативы, если вы находитесь в системе Red Hat Linux, есть предопределенные функции, которые будут печатать зеленые ОК и красные сообщения FAILED (те, которые вы видите во время загрузки):

#!/bin/bash

. /etc/init.d/functions

echo -n "Frobbing widget:"
frob_widget && echo_success || echo_failure
echo

Ответ 2

Соберите все свои строки в один var или текстовый файл, затем передайте его через команду column. Итак, это (мой пример файла /tmp/columns.txt)

Echoing random number 1080 [ OK ]
Echoing random number 44332356 [ OK ]
Echoing random number 34842 [ OK ]
Echoing random number 342 [ OK ]

стал этим

Echoing  random  number  1080      [  OK  ]
Echoing  random  number  44332356  [  OK  ]
Echoing  random  number  34842     [  OK  ]
Echoing  random  number  342       [  OK  ]

Пример команды: cat /tmp/columns.txt | column -t

Ответ 3

Чтобы расширить ответ sobi3ch: если вы объединяете строки с разделителем (я использую тильду (~)), вы можете вызвать столбец с параметром -s, чтобы разбить текст в этой точке.

Извиняюсь за жестокое обращение с кошкой:

foo.txt :

Echoing random number 1080~[ OK ]
Echoing random number 1080~[ OK ]
Echoing random number 1080~[ Failed ]

тогда:

cat foo.txt | column -s'~'

Echoing random number 1080        [ OK ]
Echoing random number 1080        [ OK ]
Echoing random number 1080        [ Failed ]