printf列对齐问题

时间:2014-01-19 01:55:34

标签: bash printf

有人可以帮我理解printf的对齐功能。我曾尝试阅读有关Stack和Google常规结果的几个示例,但我仍然无法理解其语法。这基本上就是我想要实现的目标:

HOLDING    1.1.1.1              Hostname        Potential outage!
SKIPPING   1:1:1:1:1:1:1:1      Hostname        Existing outage!

对不起,我知道这比我常见的问题更多。我真的不知道如何从这里开始。我曾尝试在过去使用echo -e“\ t”,它适用于水平放置,但不能对齐。我还使用for循环合并了一个更复杂的tcup解决方案,但在这种情况下这不会很容易。

我刚刚发现了printf的功能,看起来它会做我需要的,但我不懂语法。也许是这样的?

A="HOLDING"
B="1.1.1.1"
C="Hostname"
D="Potential outage"
for (( j=1; j<=10; j++ )); do 
  printf "%-10s" $A $B $C $D
  echo "\n"
done

这些变量将从数据库中输入。我还是不太了解printf语法吗?请帮忙

* ALSO *

非主题提问,您有什么回应的动机?我很擅长堆叠交换。除了声誉之外,你们中的一些人能从中得到任何东西。职业2.0?或者是其他东西?有些人在这个网站上有荒谬的统计数据。只是好奇驱动器是什么。

1 个答案:

答案 0 :(得分:2)

字符串%-10s可以分为多个部分:

  • %引入了转换说明符,即如何格式化参数
  • -指定该字段应保持对齐。
  • 10指定字段宽度
  • s指定数据类型string。

Bash printf格式字符串模仿C库函数printf(3)的字符串,man 3 printf中描述了此部分。

此外,当给出比转换说明符更多的参数时,Bash printf将为每个参数多次打印字符串,因此printf "%-10s" foo bar等同于printf "%-10s" foo; printf "%-10s" bar。这是允许您在同一命令上指定所有参数的原因,%-10s适用于每个参数。

至于人们的动机,你可以试试meta site,这是关于stackoverflow本身的问题。