如何对齐最后一个字段的输出

如何对齐最后一个字段的输出

bash 脚本

for i in $script_name
do
  echo -en "running the script - $i\t - "
  exec 3>&1 4>&2
  var=$( { time /tmp/scripts/$i 1>&3 2>&4; } 2>&1)  # Captures time only
  exec 3>&- 4>&-

  echo "$var"
done

打印以下内容:

running the script - Verify_disk.bash -       1.42
running the script - Verify_yum_list.bash - 10.49
running the script - Verify_size.bash -   2.93
running the script - Verify_mem_size.bash -       0.71
running the script - Verify_disk_size.bash -      2.41
running the script - Verify_wdisk.bash -        1.63
running the script - Verify_cpu.bash - 0.74

由于 $var 是打印所有这些输出的变量,我们想要对齐输出

所以会是这样的

running the script - Verify_disk.bash        -   1.42
running the script - Verify_yum_list.bash    -   10.49
running the script - Verify_size.bash        -   2.93
running the script - Verify_mem_size.bash    -   0.71
running the script - Verify_disk_size.bash   -   2.41
running the script - Verify_wdisk.bash       -   1.63
running the script - Verify_cpu.bash         -   0.74

为了对齐最后的字段,应该对 $var 进行哪些额外的更改

答案1

执行预循环来计算最长的文件名,然后将其用作间距参数:

longest=0
for file in *.bash
do
  [ "${#file}" -gt "$longest" ] && longest=${#file}
done

# ... for your execution loop
printf "running the script - %${longest}s\t- "
printf "%s\n" "$var"

我假设您的所有脚本都包含在通配符中*.bash;根据需要进行调整。初始循环计算所需的宽度;初始printf使用该变量来格式化循环每次迭代的脚本字段的宽度for

答案2

我认为您无法在脚本内进行正确的格式化,因为循环的早期迭代无法知道以下变量的宽度;两步过程怎么样?

我还冒昧地(个人喜好)右对齐时间值的输出。

将示例输入保存到文件(无法动态生成)后,我的建议如下所示:

cat yael | awk -F'-' '{printf "%s - %-30s - % 6.2f\n",$1, $2, $3}' 
running the script  -  Verify_disk.bash              -   1.42
running the script  -  Verify_yum_list.bash          -  10.49
running the script  -  Verify_size.bash              -   2.93
running the script  -  Verify_mem_size.bash          -   0.71
running the script  -  Verify_disk_size.bash         -   2.41
running the script  -  Verify_wdisk.bash             -   1.63
running the script  -  Verify_cpu.bash               -   0.74

因此,如果您要通过我的 awk 通过管道输出脚本的输出...

相关内容