Bash:如何使用bash减去两个时间字符串?

时间:2014-05-15 14:46:58

标签: bash shell

我已经创建了下一个脚本,以便找到锁定文件的年龄:

#!/bin/bash
now=`date +"%T"`
lock="aggregator.lock"
find . -name $lock -type f
if [ $? != 0 ];
        then
        exit
else
ls -ltrh $lock 2&>/dev/null
fi
if [ $? != 0 ];
        then
        locktime=`ls -ltrh aggregator.lock |awk -F" " '{print $7}'`
else
echo "File not found"
fi

我有两个问题:

  • ls -ltrh aggregator.lock |awk -F" " '{print $7}'的输出 给我时间格式为HH:MM而不是HH:MM:SS和输出 date +"%T"给了我时间格式HH:MM:SS(根据需要),所以 如何在几秒钟内获得文件的修改时间?
  • 我不知道如何在时间之间减去...我想做$now - $locktime之类的事情以获得两个变量之间的秒增量,怎么做?

编辑: 该脚本的含义是查找锁定文件存在多长时间... 有这个脚本:

device0="/home/build/aggregator/scripts/aggregator.lock"
if [ -e "$device0" ]
then
echo process is allready running
else

touch $device0
java -Xms6g  -Xmx6g -jar /home/build/aggregator/aggregator-1.0-SNAPSHOT-jar-with-dependencies.jar
rm $device0
fi

创建锁文件...创建锁文件的唯一目的是让我指出脚本的运行时间有多长,只是认为这个信息也是必需的,因为我不是在寻找自上次修改文件以来经过了多长时间。

提前致谢

5 个答案:

答案 0 :(得分:6)

要了解上次修改文件的时间,可以使用

stat -c %Y file 

要具有自the epoch以来的最后修改日期(以秒为单位)和

date +%s 

表示当前日期的相同单位。然后简单地用$(( ... ))减去它们将为您提供自上次修改文件以来经过的秒数。请注意,Unix文件系统通常不存储创建日期,只存储最后一次访问/更改/修改日期。

要转换回人类可读的格式,请参阅例如https://stackoverflow.com/a/12199798/2907484

基本上是这样的:

now=$(date +%s)                          
was=$(stat -c%Y file)      
elapsed=$((now - was))
days=$((elapsed/86400))
hours=$(( (elapsed-days*86400)/3600 ))   
mins=$(( (elapsed-days*86400 - hours*3600)/60 ))
secs=$(( elapsed - days*86400 - hours*3600 - mins*60 )) 

现在您可以根据需要使用echoprintf格式化输出

printf '%02dd:%02dh:%02dm:%02ds\n' $days $hours $mins $secs

将输出

00d:18h:42m:27s

格式%02d可能几天都不合适 - 但你明白了。您也可以轻松添加周,年或其他任何内容。

要查看脚本/程序运行的时间,您可以使用bash内置命令time或实用程序/usr/bin/timebe sure to not confound them),或者您可以按照这个想法在此脚本中使用:

was=$(date +%s)
...run your script...
now=$(date +%s) 

并继续如上所述。

答案 1 :(得分:4)

如果你有stat(它是GNU coreutils包的一部分,所以你应该在任何GNU / linux系统上找到它),那么你可以在几秒钟内直接获得文件的修改时间:

stat -c%Y aggregator.lock

请参阅man stat以获取有关文件的完整数据列表,以及相应的格式(-c)代码。

这可以让你简单地写一下,例如:

elapsed=$(( $(date +%s) - $(stat -c%Y aggregator.lock) ))

$(( ... ))是算术扩展的bash语法,请参阅man bash

答案 2 :(得分:2)

如果你需要算术,最好使用Unix时间戳(自1970年1月1日以来经过的秒数)。使用GNU date的示例,但可以使用其他版本实现相同的想法。

now=$(date +%s)
locktime=$(date +%s --date 13:50:32)
diff=$(( now - lock time ))

此外,如果可能,最好使用stat来获取锁定文件的修改时间。

答案 3 :(得分:0)

你可以让find立即输出时间戳,所以尝试这样的事情:

locktime=$(find -maxdepth 1 -name aggregator.lock -printf '%T@')
now=$(date +%s)
delta=$(($now - $locktime))
printf "The file was modified %.0f seconds ago" $delta

答案 4 :(得分:0)

我编辑了我的剧本,现在是:

#!/bin/bash
#file="/home/build/aggregator/scripts/aggregator.lock"
file="$1"

if [ -e "$file" ]; then 
    now=$(date +%s)                          
    was=$(stat -c%Y $file) 
    elapsed=$((now - was))
    echo $elapsed 
else
    echo 0
fi

然后从Zabbix我可以运行脚本并获取文件存在的秒数,如果文件不存在则获取“0”:

[root@zabbix ~]# zabbix_get -s 10.200.X.X -k check.lock[/home/build/aggregator/scripts/aggregator.lock]
14
[root@zabbix ~]#

感谢大家的解决方案。