【问题标题】:formatting bash/shell script time to days, hours, minutes and second将 bash/shell 脚本时间格式化为天、小时、分钟和秒
【发布时间】:2014-08-12 09:59:06
【问题描述】:

我有一个用 bash/shell 脚本语言编写的备份脚本。我通过这样做来计算总运行时间/执行时间:

#!/bin/bash

# start time
res1=$(date +%s.%N)

### do some work here

# end time & calculate
res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)

# finished
printf " >>> Process Completed - Total Runtime (d:h:m:s) : %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
echo " "
exit 0

这会输出如下内容:

你如何格式化结果,所以它看起来像这样:

0 天 0 小时 0 分钟 0.0968 秒

如果它可以智能地仅显示 > 0 的值,就像这些示例一样 - 那将是无用的:

  • 7 分 5.126 秒 或
  • 2 小时 4 分 1.106 秒 或
  • 7.215 秒等...

【问题讨论】:

    标签: linux bash shell time formatting


    【解决方案1】:

    你可以像这样使用你最后的printf

    printf " >>> Process Completed - Total Runtime (d:h:m:s) : %d Days, %02d Hours, %02d Minutes, %02.4f Seconds\n" $dd $dh $dm $ds
    

    但是我建议您使用 awk 并在 awk 本身中进行所有计算和格式化,这样您就可以避免多次调用 bc

    建议的 awk 脚本:

    awk -v res1="$res1" -v res2="$res2" 'BEGIN {dt=res2-res1; dd=dt/86400; dt2=dt-86400*dd; 
          dh=dt2/3600; dt3=dt2-3600*dh; dm=dt3/60; ds=dt3-60*dm;
          printf " >>> Process Completed - Total Runtime (d:h:m:s) : %d Days, %02d Hours, %02d Minutes, %02.4f Seconds\n",
          dt/86400, dd, dh, dm, ds}'
    

    【讨论】:

    • 谢谢,这行得通。你如何在我的脚本中使用awk?是否有可能具有仅智能输出经过值的功能(忽略零值 - 请参阅我更新的帖子)?
    • 好的,我会在几分钟后用 awk 脚本更新我的答案。
    • 谢谢,非常感谢。当我有能力时,我会接受这个作为答案。
    • 我提供了一个 awk 脚本来做同样的事情,但无法测试,因为我没有 res1res2 的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多