我有一个脚本,可以根据 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
重建整个字段。$0
NF
/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
这是基于选项卡的答案的概括,但不一定需要插入选项卡。