Как выровнять несколько строк с Echo или Print

Продолжайте пробовать различные mac-адреса, в настоящее время после нескольких попыток подключился к wifi с поддельным mac. macchanger сгенерировал mac-адрес, который не работал и был 10.something.something.something
Взял mac-адрес из старого wireshark захвата и он отлично работает, получая обычный 192.168.1.something на моем wifi.
Некоторые биты адреса представляют особенности.

7
01.06.2018, 12:35
4 ответа

Una forma es introducir una pestaña antes del código de estado, p.:

<input rev | sed 's/ /\t/' | rev | column -s $'\t' -t

Salida:

/  is mounted                        OK
/boot  is mounted                    OK
/was8  is mounted                    OK
/was8/slogs  is mounted              OK
/was8/cluster  is mounted            OK
/was8/working  is mounted            OK
/was8/app  is mounted                OK
/was8/tools  is mounted              OK
/was8/plugin  is mounted             OK
/was8/coreproduct  is mounted        OK
/was8/ihs  is mounted                OK
/was8/backup  is mounted             OK
/was8/ihs/logs  is mounted           OK
/was8/wsdm  is mounted               OK
/was8/ws  is mounted                 OK
/was8/ihs/logs/analysis  is mounted  OK
4
27.01.2020, 20:13

Solo un poco de ofuscación de Perl:

perl -ne 'printf "%-40s %s", /(.*) (.*)/s'
6
27.01.2020, 20:13

В общем, когда вы выполняете печать, вы можете установить ширину в строке формата на printf. %-20sнапечатает строку в поле шириной 20 символов (*), если только оно не переполнится. %-20.20sсделает его 20-символьным и отбросит всю переполняющую часть.

(*Хотя, например,. Bash printfна самом деле считает байт . Разницу можно увидеть с такими символами, как äв UTF -8.)

Так, например.

printf "%-40s %s\n" "$mountpoint  is mounted" "$status"

сделает первую часть (шириной не менее )40 символов:

/was8/coreproduct  is mounted            OK
...

Или, если вам нужно опубликовать -обработку такого ввода, вы можете использовать Perl или awk:

perl -pe 's/(.*) +(\S+)$/ sprintf "%-40s %s", $1, $2 /e'  < file

awk '{s=$NF; sub(/ *[^ ]+ *$/, "", $0); printf "%-40s %s\n", $0, s}'  < file

Оба в основном разделяют последнюю строку, не являющуюся пробелом -, а затем печатают две части с первой в поле фиксированной ширины -.


Или, если вы не заботитесь о том, чтобы разделение между полями оставалось таким, каким оно было, более простым решением, прокомментированным @ JJoao , будет:

awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}' < file

Это приводит к следующему результату. Обратите внимание, что два пробела -перед is mountedсвернуты в один. Это происходит потому, что awkперестраивает весь $0при изменении NFили любого из полей.

/was8/coreproduct is mounted             OK
12
27.01.2020, 20:13

Это также можно очень легко сделать с помощью утилиты столбца. Суть в том, чтобы включить какой-то отличительный маркер между вашими «столбцами». Например, если пробел является отличительным маркером, то column -s ' ' -o ' ' -tбудет идеально выравниваться по пробелам.

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

column -s <Separator String> -o <Separator String in Output> -t

Это обобщение ответа на основе табуляций, но не требует обязательной вставки табуляции.

1
27.01.2020, 20:13

Теги

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