Em geral, quando você está imprimindo, pode definir a largura na string de formato como printf
. %-20s
imprimia uma string em um campo com 20 caracteres (*) de largura, a menos que estourasse. %-20.20s
teria 20 caracteres e eliminaria qualquer parte transbordante.
(* Embora, por exemplo, o printf
do Bash realmente conte bytes . A diferença pode ser vista com caracteres como ä
em UTF-8.)
Então, por exemplo,
printf "%-40s %s\n" "$mountpoint is mounted" "$status"
teria a primeira parte (pelo menos) 40 caracteres de largura:
/was8/coreproduct is mounted OK
...
Ou, se você precisar pós-processar uma entrada como essa, pode usar o Perl ou o awk:
perl -pe 's/(.*) +(\S+)$/ sprintf "%-40s %s", $1, $2 /e' < file
awk '{s=$NF; sub(/ *[^ ]+ *$/, "", $0); printf "%-40s %s\n", $0, s}' < file
Ambos basicamente separam a última string que não é espaço em branco e, em seguida, imprimem as duas partes com a primeira em um campo de largura fixa.
Ou, se você não se importa em manter exatamente a separação entre os campos, uma solução mais simples comentada por @ JJao seria:
awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}' < file
Isso produz a saída abaixo. Observe que o espaço em branco de dois espaços antes de is mounted
é reduzido para um. Isso acontece porque awk
reconstrói todo o $0
quando NF
ou qualquer um dos campos é modificado.
/was8/coreproduct is mounted OK