【问题标题】:Shell - Retrieve part of a filename using patternShell - 使用模式检索文件名的一部分
【发布时间】:2019-11-13 03:03:13
【问题描述】:

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

/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

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

extractTimeinSecond() {
   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
   time=$(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
   echo $(( $h + $m + $s )) # 21600 + 720 + 55 = 22375
}


【问题讨论】:

  • cutbasename 不是纯 bash。

标签: string bash shell time extraction


【解决方案1】:

使用 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));
}    

【讨论】:

    【解决方案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 解决方案会快得多,但这是添加到工具箱中的绝妙技巧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2014-10-15
      • 2014-07-28
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多