当格式没有修复时,如何从shell变量的末尾提取时间戳?

时间:2015-11-16 21:16:31

标签: regex perl shell awk

我试图从shell变量的末尾提取时间戳,如下所示:

Input=AEXP_CSTONE_EU_prpbdp_sourcefile_yyyymmddhhmmss.txt
TimeStamp=`echo $Input | awk -F"_" '{print $6}'`

这适用于此特定情况,但字符串的格式可能会更改。例如,它也可能是:

Input=AEXP_CSTONE_EU_prpbdp_sourcefile_prospects_yyyymmddhhmmss.txt

变量将始终以yyyymmddhhmmss.txt结尾。如何一致地提取时间戳?

3 个答案:

答案 0 :(得分:2)

假设:

SELECT Name FROM Client WHERE TYPE = ' -- /* comment the rest ';

您可以使用$ echo $Input AEXP_CSTONE_EU_prpbdp_sourcefile_prospects_20151116141111.txt

sed

或嵌套的grep:

$ echo $Input | sed -n 's|.*_\([0-9]\{14\}\)\.txt|\1|p' 
20151116141111

AWK:

$ echo $Input | grep -Eo '_[0-9]{14}\.txt' | grep -Eo '[0-9]{14}'
20151116141111

的Perl

$ echo $Input | awk -F_ '{split($NF, a, "."); print a[1]}'
20151116141111

cut and rev:

$ echo $Input | perl -ne 'print $1 if /_(\d{14})\.txt/'
20151116141111

击:

$ echo $Input | rev | cut -d'_' -f 1 | rev | cut -d'.' -f 1
20151116141111

总之,有很多方法......

如果您不想放松$ last=${Input##*_} $ echo $last 20151116141111.txt $ ts=${last%.*} $ echo $ts 20151116141111 部分,请更加轻松:

.txt

答案 1 :(得分:0)

您需要匹配更改的部分:

TimeStamp=$(echo $Input | perl -pe 's/.*(\d{14})\.txt/$1/')

答案 2 :(得分:0)

您正在提取由_分隔的第6个字段,但似乎您确实要提取最后一个字段。你可以通过参数扩展来做到这一点:

timestamp=${Input##*_}
timestamp=${timestamp%.txt}

有关bash中字符串操作的更多信息,请参阅BashFAQ 100

在awk中,您使用$NF来引用最后一个字段,虽然awk对此有点过分。