Shell - 使用模式检索文件名的一部分
Shell - Retrieve part of a filename using pattern
从当前文件名中提取时间并将其转换为自当天 00:00 以来的秒数( 无时间戳)并使用 [=20] 的最佳方法是什么=]纯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= # /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
}
使用 awk:
extractTimeinSecond() {
basename "" | awk -F'[-_]' '{print (*60+)*60+}'
}
仅使用 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
,
$: 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
解决方案会快得多,但这是添加到工具箱中的绝妙技巧。
从当前文件名中提取时间并将其转换为自当天 00:00 以来的秒数( 无时间戳)并使用 [=20] 的最佳方法是什么=]纯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= # /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
}
使用 awk:
extractTimeinSecond() {
basename "" | awk -F'[-_]' '{print (*60+)*60+}'
}
仅使用 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
,
$: 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
解决方案会快得多,但这是添加到工具箱中的绝妙技巧。