如何在bash中打印一些文本并用空格填充到一定宽度?

PHL*_*LAK 40 printing variables bash formatting printf

我在一个带有变量的bash脚本中回显一些文本,并且想要填充该变量,以便它总是在右边有适当的空格,以保持文本的其余部分对齐.

这是我想要的一个例子:

Echoing random number 1080    [ OK ]
Echoing random number 443     [ OK ]
Echoing random number 34842   [ OK ]
Run Code Online (Sandbox Code Playgroud)

数值的长度可以变化(可能不超过5或6位).

我知道printf可以执行此操作并通过执行以下操作右对齐变量:

printf "Echoing random number %5s   [ OK ]" $RAND_NUM
Run Code Online (Sandbox Code Playgroud)

但是,这会格式化文本,如下所示:

Echoing random number  1080   [ OK ]
Echoing random number   443   [ OK ]
Echoing random number 34842   [ OK ]
Run Code Online (Sandbox Code Playgroud)

当然只是用空格回声并不起作用:

echo "Echoing random number ${RAND_NUM}   [ OK ]"
Run Code Online (Sandbox Code Playgroud)

产生这个:

Echoing random number 1080   [ OK ]
Echoing random number 443   [ OK ]
Echoing random number 34842   [ OK ]
Run Code Online (Sandbox Code Playgroud)

有没有办法像我的第一个例子那样打印文本?

Joh*_*ica 56

使用-左对齐的字段.

printf "Echoing random number %-5s   [ OK ]" $RAND_NUM
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是Red Hat Linux系统,则预定义的功能将打印出绿色OK和红色FAILED提示(您在启动时看到的提示):

#!/bin/bash

. /etc/init.d/functions

echo -n "Frobbing widget:"
frob_widget && echo_success || echo_failure
echo
Run Code Online (Sandbox Code Playgroud)

  • @ user35186请参阅系统上的`/ lib/lsb/init-functions`,这是脚本的现代跨发行版本.如果你有,你可以使用`log_success_msg`,`log_failure_msg`和`log_warning_msg`. (3认同)

sob*_*3ch 13

将所有行收集在一个 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 ]
Run Code Online (Sandbox Code Playgroud)

变成了这个

Echoing  random  number  1080      [  OK  ]
Echoing  random  number  44332356  [  OK  ]
Echoing  random  number  34842     [  OK  ]
Echoing  random  number  342       [  OK  ]
Run Code Online (Sandbox Code Playgroud)

示例命令: cat /tmp/columns.txt | column -t

  • 如果使用分隔符连接字符串(我使用 tilda (~)),则可以使用 -s 参数调用 column 来划分该字符上的列。例如: echo "回显随机数 1080~[ OK ]\n回显随机数 1080~[ OK ]" | -s'~' 列给出回显随机数 1080 [ OK ] (4认同)

Ste*_*ond 5

扩展 sobi3ch 的答案:如果您使用分隔符连接字符串(我使用 tilda (~)),则可以使用 -s 参数调用 column 来在该点拆分文本。

对虐待猫的行为致歉:

foo.txt :

Echoing random number 1080~[ OK ]
Echoing random number 1080~[ OK ]
Echoing random number 1080~[ Failed ]
Run Code Online (Sandbox Code Playgroud)

然后 :

cat foo.txt | column -s'~'

Echoing random number 1080        [ OK ]
Echoing random number 1080        [ OK ]
Echoing random number 1080        [ Failed ]
Run Code Online (Sandbox Code Playgroud)

  • 如果你不想被指责为占卜,那就这样做:`column -s'~' < foo.txt` (2认同)