Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在Unix/Linux中使用命令行计算日期和时间以跟踪时间_Bash - Fatal编程技术网

Bash 在Unix/Linux中使用命令行计算日期和时间以跟踪时间

Bash 在Unix/Linux中使用命令行计算日期和时间以跟踪时间,bash,Bash,我正在寻找一种使用命令行跟踪项目工作时间的简单方法。我知道 echo "$(date) : Start" >>worktime.txt 当我开始工作和 echo "$(date) : End" >>worktime.txt 当我停止工作的时候。结果是一个如下格式的文件: kent@rat:~/work$ cat worktime.txt Fri Jan 2 19:17:13 CET 2009 : Start Fri Jan 2 19:47:18 CET 2009

我正在寻找一种使用命令行跟踪项目工作时间的简单方法。我知道

echo "$(date) : Start" >>worktime.txt
当我开始工作和

echo "$(date) : End" >>worktime.txt
当我停止工作的时候。结果是一个如下格式的文件:

kent@rat:~/work$ cat worktime.txt 
Fri Jan  2 19:17:13 CET 2009 : Start
Fri Jan  2 19:47:18 CET 2009 : End
Fri Jan  2 21:41:07 CET 2009 : Start
Fri Jan  2 22:39:24 CET 2009 : End
“开始”和“结束”是指描述,可以是任何其他文本可以肯定的是每一个奇数行包含一个开始日期和时间:每一个偶数行包含一个结束日期和时间

我想做的是通过使用bash、tr、sed、awk和其他常见的Unix/Linux工具解析文本文件来总结我的工作时间。我更喜欢使用这种方法,而不是使用Python、Perl、Haskell、Java等


欢迎所有想法

假设您正在使用GNU coreutils,请运行
date+%s

echo $(date +%s) : Start
%s占位符不符合POSIX,并且特定于GNU日期。它由自epoch以来经过的秒数替换。接下来,写一个脚本,将差异归纳起来。你会做类似的事情

#!/bin/bash

total=0
while read LINE; do
  t1=$(echo $LINE |cut -d' ' -f1)
  read LINE
  t2=$(echo $LINE |cut -d' ' -f1)
  total=$(($total+$t2-$t1))
done
echo "$(echo "scale=2; $total/(60*60)" |bc -l)" hours
如果调用脚本sum_time.sh,则可以使用


~$./sum\u time.sh以下awk脚本应该可以完成此任务(但未测试):


关键是
date+%s
返回自1970年以来的秒数,
-d
指定一个替代时间/日期,而不是现在的

如果您需要使用稍微修改的版本,以便可以继续使用
$(日期)
而不是
$(日期+%s),wilhelmtell有一个很棒的脚本
这将以相同的方式工作,只需添加一行代码,使用
+%s

#!/bin/bash
total=0
while read LINE; do
  d1=$(echo $LINE |cut -c1-28);
  t1=$(date -d "$d1" +%s);
  read LINE
  d2=$(echo $LINE |cut -c1-28);
  t2=$(date -d "$d2" +%s);
  total=$(($total+$t2-$t1));
done
echo $(($total/(60*60))) hours

或者你可以使用已经存在的东西:


因为目标是进行如下总体计算:

total= (FirstEnd - FirstStart ) + (ScndEnd - ScndStart) 
可以这样写:

total= - FirstStart + FirstEnd - ScndStart + ScndEnd ...
echo $(
    sed <worktime.txt 's/ : .*$//g' |
        date -f - +%s |
        xargs printf "-%s+%s"
  ) | bc
唯一的要求是,
worktime.txt
(每个开始都有相应的结束)中只有完整的对

有一个非常快速的方法:

echo $(sed <worktime.txt 's/ : .*$//g'|date -f - +%s|xargs printf "-%s+%s")|bc
5302

echo$(sed这是awk吗?我想应该提一下。起初它看起来像Bash,然后我意识到它可能是awk。你确实得到了我的支持,很好的脚本。但是我认为纯Bash中的解决方案也很好,所以我把它作为我公认的答案(因为它不需要awk,而且同样复杂).很好的改进。保持日期和时间信息的方式对我来说很重要。很好的脚本,它看起来很可靠,但是我同意Jehiah的改进版本作为我接受的答案,因为我需要保持日期和时间信息的完整性。谢谢你的建议。如果有一天我有时间,我会研究它,目前我对它感到满意这是一个简单的(而且“保证”没有bug的[非常简单,我不希望有任何bug])解决方案。:-)无论如何,这不是我所知道的tt:(我将链接更改为meant@sdaau:这是一场打鼹鼠的游戏:)
echo $(
    sed <worktime.txt 's/ : .*$//g' |
        date -f - +%s |
        xargs printf "-%s+%s"
  ) | bc