我正在编写一个脚本来存档文件并将它们上传到某个位置。
我遇到以下问题:
while IFS= read -r THELINE; do
Filename=$(awk -F:: '{print $1}' <<< "$THELINE")
Pattern=$(awk -F:: '{print $2}' <<< "$THELINE")
Location=$(awk -F:: '{print $3}' <<< "$THELINE")
dailydate=$startdate
while [[ $dailydate -le $enddate ]]
do
YEAR=${dailydate:0:4}
MONTH=${dailydate:4:2}
DAY=${dailydate:6:2}`
echo $Pattern
dailydate=`/bin/date --date="$dailydate 1 day" +%Y%m%d`
done
done < $FileDetails
$FileDetails
配置文件的文件名,模式和位置由::分隔。我如图所示提取它们。
问题在于模式..
我有这种格式:
Filename_$YEAR_$MONTH_$DAY.gz
,在配置文件中。
我也在日期变量的循环中创建名为YEAR,MONTH和DAY的变量。
我希望“Pattern”变量可以读取那些YEAR,MONTH,DAY变量。
例如,当我在创建YEAR,MONTH,DAY变量后回显$ PATTERN时,我希望它会打印出像
Filename_2015_07_29.gz
目前,它只是打印一个NULL。
首先,这甚至可能吗? 如果是这样,怎么样?
谢谢!
编辑:
变量startdate和enddate作为参数传递给脚本。
这是配置文件模式:
Filename::filepattern_${YEAR}_${MONTH}_${DAY}.gz::File/location/some/where
脚本读取此行,将文件名,模式,位置提取到变量中。 然后,它将给定日期分为年,月,日。 最后,当我打印Pattern时,我想在其中看到这些值。
例如: 当dailydate = 20150729 那么Pattern应该是:filepattern_2015_07_29.gz
想法是迭代输入的日期范围。 (从20150507到20150707说)。
答案 0 :(得分:2)
eval echo $Pattern
eval
将扩展模式中的变量。
答案 1 :(得分:1)
这是你想要的吗?
$ cat tst.awk
BEGIN {
FS="::"
startSecs = mktime(gensub(/(....)(..)(..)/,"\\1 \\2 \\3 0 0 0","",startDate))
endSecs = mktime(gensub(/(....)(..)(..)/,"\\1 \\2 \\3 0 0 0","",endDate))
}
{
for (curSecs=startSecs; curSecs<=endSecs; curSecs+=(24*60*60)) {
pattern = $2
sub(/\${YEAR}_\${MONTH}_\${DAY}/, strftime("%Y_%m_%d",curSecs), pattern)
print pattern
}
}
$ awk -v startDate=20150507 -v endDate=20150510 -f tst.awk file
filepattern_2015_05_07.gz
filepattern_2015_05_08.gz
filepattern_2015_05_09.gz
filepattern_2015_05_10.gz
或者如果您因某种原因需要拆分y / m / d,只需将上面的sub()
行更改为3个单独的sub()
:
curDate = strftime("%Y%m%d",curSecs)
sub(/\${YEAR}/, substr(curDate,1,4), pattern)
sub(/\${MONTH}/, substr(curDate,5,2), pattern)
sub(/\${DAY}/, substr(curDate,7,2), pattern)
以上使用GNU awk作为时间函数,与其他awks一起调用shell date
并将结果传递给awk的getline
。
如果上述情况不符合您的要求,请编辑您的问题以澄清并提供可测试的样本输入和预期输出。