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

String Shell-使用模式检索文件名的一部分,string,bash,shell,time,extraction,String,Bash,Shell,Time,Extraction,从这个文件名中提取时间并从当前日期的00:00开始以秒为单位转换它的最佳方法是什么?没有时间戳并且使用纯bash 预期产出: extractTimeinSecond() { // code } filetime=$(extractTimeinSecond $file) echo $filetime # 22375 我本来会做这样的事情,但这不是很性感,因为我相信有更好的方法 提取时间不连续{ file=$1/a/very/long/path/to/my/files/2019-07-02_06

从这个文件名中提取时间并从当前日期的00:00开始以秒为单位转换它的最佳方法是什么?没有时间戳并且使用纯bash

预期产出:

extractTimeinSecond() {
 // code
}
filetime=$(extractTimeinSecond $file)
echo $filetime # 22375
我本来会做这样的事情,但这不是很性感,因为我相信有更好的方法

提取时间不连续{ file=$1/a/very/long/path/to/my/files/2019-07-02_06_12_55_SOME_FOO_BAR.log shortfile=$basename$file 2019-07-02_06_12_55_SOME_FOO_BAR.log 时间=$echo$shortfile | cut-d'-f 2,3,4 06_12_55 h=$$echo$time | cut-d'-f1*60*60 06*60*60=21600 m=$$echo$time | cut-d''-f2*60 12*60=720 s=$echo$time | cut-d'-f3 55 回声$$h+$m+$s 21600+720+55=22375 } 使用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));
}    
使用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));
}    

要干净地收集时间组件,请执行以下操作: 假设log=/a/very/long/path/to/my/files/2019-07-02_06_12_55_SOME_FOO_BAR.log

减去秒数

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

awk解决方案会快得多,但这是添加到工具箱中的一个很好的技巧。

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

减去秒数

$: echo $(( secstamp - midnight ))
22375
awk解决方案会快得多,但这是添加到工具箱中的一个很好的技巧。

cut和basename不是纯bash。cut和basename不是纯bash。