如何使用 echo 或 print 对齐多行

如何使用 echo 或 print 对齐多行

我有一个脚本,可以根据 fstab 下列出的条目检查已安装的文件系统,我在这里面临的问题是保持输出对齐。

以下是脚本输出:

/  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
...

我想让这些线保持对齐,所以它应该看起来像这样:

/  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
...

我已经尝试了 column 和 xargs 无法获得所需的结果。有人可以帮我弄这个吗。

答案1

一般来说,在进行打印时,可以将格式字符串中的宽度设置为printf。将在 20 个字符(*)%-20s宽的字段上打印字符串,除非它溢出。会将其变为 20 个字符并删除任何溢出的部分。%-20.20s

(* 虽然例如 Bashprintf实际上很重要字节。可以通过 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

两者基本上都分隔最后一个非空白字符串,然后将两个部分与第一个部分打印在固定宽度字段上。


或者,如果您不关心保持字段之间的分隔完全相同,@ 评论了一个更简单的解决方案乔奥将会:

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

这会产生以下输出。请注意,前面的两个空格is mounted已折叠为一个。发生这种情况是因为当或任何字段被修改时awk重建整个字段。$0NF

/was8/coreproduct is mounted             OK

答案2

只是一些令人困惑的 Perl:

perl -ne 'printf "%-40s %s", /(.*) (.*)/s'

答案3

一种方法是在状态代码之前引入一个选项卡,例如:

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

输出:

/  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

这也可以通过列实用程序轻松完成。关键是在“列”之间包含某种区分标记。例如,如果空间是区分标记,那么column -s ' ' -o ' ' -t将在空间上完美对齐。

我经常使用它,甚至制作了一些很好的 vim 宏,利用它来对齐代码。您想要的一般语法是:

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

这是基于选项卡的答案的概括,但不一定需要插入选项卡。

相关内容