【问题标题】:Format output of multiple bash commands into columns将多个 bash 命令的输出格式化为列
【发布时间】:2013-03-06 15:02:33
【问题描述】:

我想做的很简单,但是没有几个命令我就无法完成。到目前为止,这就是它的样子。我希望能够在一条看起来很草率的行中完成此操作,一次通过所有命令。

# cat /sys/class/scsi_host/host*/device/fc_host:host*/port_name >port
# cat /sys/class/scsi_host/host*/device/fc_host:host*/speed >speed
# cat /sys/class/scsi_host/host*/device/fc_host:host*/port_state >state
# paste -d ' ' port speed state
0x218000e01a0002d2 8 Gbit Online
0x218100e01a2002d2 8 Gbit Online

我尝试使用子 shell、变量等来执行此操作。格式最终未对齐,或者更糟。

# echo "$port_name" "$speed" "$state"
0x218000e01a0002d2
0x218100e01a2002d2 8 Gbit
8 Gbit Online
Online

# paste -d ' ' "$(cat /sys/class/scsi_host/host*/device/fc_host:host*/port_name)" "$(cat /sys/class/scsi_host/host*/device/fc_host:host*/speed)"
paste: 0x218000e01a0002d2
0x218100e01a2002d2: No such file or directory

【问题讨论】:

    标签: bash concatenation paste cat


    【解决方案1】:

    代替命令替换,尝试进程替换:

    paste -d ' ' <(cat /sys/class/scsi_host/host*/device/fc_host:host*/port_name) \
                 <(cat /sys/class/scsi_host/host*/device/fc_host:host*/speed) \
                 <(cat /sys/class/scsi_host/host*/device/fc_host:host*/port_state)
    

    【讨论】:

    • 我以前用 tee 读过进程替换,但这让我很困惑。这使它进入一个更简单的上下文。
    【解决方案2】:

    这个怎么样?

    for i in /sys/class/fc_host/host*; do (cd $i; echo -e "$(cat port_name)\t$(cat port_state)\t$(cat speed)"); done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-21
      • 2023-03-04
      • 2023-01-23
      • 2014-05-20
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多