【问题标题】:Using 'column -t' on macOS vs. CentOS在 macOS 和 CentOS 上使用 'column -t'
【发布时间】:2019-05-14 11:11:39
【问题描述】:

我想在漂亮的表格中打印一些文本。 举个例子:

{
    echo -e "\tIP address:-1.2.3.4"
    echo -e "\tNetmask:-1.2.3.4"
    echo -e "\tGateway:-1.2.3.4"
    echo -e "\tDefault gateway:-1.2.3.4"
} | column -ts-

在 macOS(对我来说是 10.14.4)上,打印结果与我预期的一样:

    IP address:       1.2.3.4
    Netmask:          1.2.3.4
    Gateway:          1.2.3.4
    Default gateway:  1.2.3.4

但是,在 CentOS 上(在 6 和 7 上测试过),它就不是那么漂亮了:

    IP address:   1.2.3.4
    Netmask:   1.2.3.4
    Gateway:   1.2.3.4
    Default gateway:   1.2.3.4

所以我的问题是:我应该这样做有更好的方法吗?至少对于 CentOS?

如果你能告诉我为什么它可以在 macOS 但不能在 CentOS 上运行,那就加分!

编辑

我的输出(即列)的长度可能会因一些不同的因素而有所不同,因此我更喜欢这样的解决方案,我不必手动指定要打印的空格数以使其看起来更漂亮。

【问题讨论】:

  • 我认为问题与终端有关,而不是与操作系统有关。如果终端被编程或配置为将制表符显示为四个空格,它将产生第二个输出。
  • @oguzismail,即使在使用tabs -n 设置制表位后,我也会得到类似的结果,其中n 是一些自然数。值得注意的是,macOS 是我的本地操作系统(使用终端),我通过 SSH 连接到 CentOS 主机。
  • 如果从每个回显字符串的前面删除\ts 会发生什么?如果有帮助,您可以随时在column 之后添加| sed 's/^/\t/' 以将它们重新添加。
  • @EdMorton,在column 命令有效之后添加选项卡!但是,我可以看到在不同的用例中,可能不希望在命令块的 everything 输出之前添加选项卡。此外,Mac 上的 sed 不喜欢 \t 转义序列。你必须使用 control-v,然后点击 tab 来插入一个文字标签。
  • @EdMorton,这在两个平台上都有效(仅针对此评论缩短为单行):echo -e "IP address:-1.2.3.4\nNetmask:-1.2.3.4\nGateway:-1.2.3.4\nDefault gateway:-1.2.3.4" | column -ts- | sed s/^/$'\t'/

标签: bash macos centos


【解决方案1】:

echocolumn 非常适合在命令行中破解。

漂亮打印的最佳实践通常涉及printf

IPv4=('IP address:' 1.2.3.4 Netmask: 1.2.3.4 Gateway: 1.2.3.4 Default\ gateway: 1.2.3.4)
ip=; for ip in "${IPv4[@]}"; do ((${#ip} > max)) && max=${#ip}; done
printf "\t%-$((max+2))s%s\n" "${IPv4[@]}"

\t%-18s%s\n 表示“文字制表符,字符串填充到 18 个字符,字符串,换行符”。它包含两个参数说明符%x,bash 将为所有参数回收它们。

注意:多词元素必须被引用或转义其空格才能单独处理

编辑:添加了灵活的最大长度

【讨论】:

  • 这行得通。但是,我的输出长度可能会有所不同,因此我更喜欢不需要手动指定/更新要填充的空格数的解决方案。我将更新我的问题以表明这一点。
  • ez,添加了该功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2015-01-18
相关资源
最近更新 更多