Shell-使用模式检索文件名的一部分

时间:2019-07-02 12:49:42

标签: string bash shell time extraction

从该文件名中提取时间并将其转换为自当前日期00:00(无时间戳)并使用纯bash 后的秒数的最佳方法是什么?

from itertools import filterfalse as ffilter
missing_paths = list(filter(ispath, paths))

期望的输出:

/a/very/long/path/to/my/files/2019-07-02_06_12_55_SOME_FOO_BAR.log

我会做这样的事情,但这并不是很性感,因为我相信有更好的方法来获取它。

extractTimeinSecond() {
 // code
}
filetime=$(extractTimeinSecond $file)
echo $filetime # 22375

2 个答案:

答案 0 :(得分:2)

使用awk:

extractTimeinSecond() {
   basename "$1" | awk -F'[-_]' '{print ($4*60+$5)*60+$6}'
}

仅使用bash:

extractTimeinSecond() {
   a=${1##*/}
   b=${a#*_}
   hour=${b/_*}
   c=${b#*_}
   minute=${c/_*}
   d=${c#*_}
   second=${d/_*}
   echo $(((hour*60+minute)*60+second));
}    

答案 1 :(得分:2)

要干净地收集时间成分: 假设log=/a/very/long/path/to/my/files/2019-07-02_06_12_55_SOME_FOO_BAR.log

$: f="${log##*/}"                       # strip path
$: IFS=_ read date h m s trash <<< "$f" # parse time elements
$: echo "$date $h:$m:$s"                # check values
2019-07-02 06:12:55

$: secstamp=$( date +%s -d "$date $h:$m:$s" )
echo $secstamp
1562065975

我假设即使在其他日期检查,您也希望秒数成为日志时间戳记的那一天?

$: midnight=$( date +%s -d "$date 00:00:00" )
$: echo $midnight
1562043600

减去秒。

$: echo $(( secstamp - midnight ))
22375

awk解决方案会更快,但这是添加到工具箱中的绝妙技巧。