我试图从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
结尾。如何一致地提取时间戳?
答案 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对此有点过分。