Shell - Получить часть имени файла, используя шаблон - PullRequest
1 голос
/ 02 июля 2019

Каков наилучший способ извлечь время из этого имени файла и преобразовать его в секундах с 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
}


Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Чтобы точно собрать компоненты времени: Предположим, 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 будет намного быстрее, но это отличный прием для добавления в набор инструментов.

2 голосов
/ 02 июля 2019

Использование 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));
}    
...