awk 日期变量

awk on a date variable

什么是有效的:

echo "Oct 12 2021" | awk '{print "date -d\""FSFS"\" +%Y%m%d"}' | bash

如何在 bash 脚本中使用变量?

mydate="Oct 12 2021"
awk -v dateformat= ''$mydate" '{print "date -d\""FSFS"\" +%Y%m%d"}'

你显然不会真正使用 awk 来调用单个值的 date 但我假设你在你的真实代码中有更多的想法所以这就是你所要求的(使用 awk 变量作为日期从 awk 调用 GNU date):

mydate="Oct 12 2021"
awk -v date="$mydate" 'BEGIN {
   system("date -d7" date "7 +7%Y%m%d7")
}'
20211012

或者如果您愿意:

awk -v date="$mydate" 'BEGIN {
    cmd = "date -d7" date "7 +7%Y%m%d7"
    print ( (cmd | getline line) > 0 ? line : date"=N/A" )
    close(cmd)
}'
20211012

但是不要做任何一个。从 awk 调用外部命令非常慢,当您只想将文本从一种格式更改为另一种格式时,您不需要这样做:

$ awk -v date="$mydate" 'BEGIN {
    split(date,d);
    mth = (index("JanFebMarAprMayJunJulAugSepOctNovDec",d[1])+2)/3
    printf "%04d%02d%02d\n", d[3], mth, d[2]
}'
20211012

另外,如果你有 GNU awk,它有 built-in 时间函数,所以即使你想做的不只是打乱周围的文本位,你也可以调用内部 mktime()strftime() 而不是外部 date:

awk -v date="$mydate" 'BEGIN {
    split(date,d)
    mth = (index("JanFebMarAprMayJunJulAugSepOctNovDec",d[1])+2)/3
    secs = mktime(d[3]" "mth" "d[2]" 12 0 0")
    print strftime("%Y%m%d",secs)
}'
20211012

您的原始示例使用 awk 准备参数,然后将这些参数传递给 Linux 日期命令 运行ning in bash;日期格式由 date 命令执行。

您不需要为此使用 awk,日期命令 -d 选项在其接收的格式方面非常灵活。

mydate="Oct 3 2021"
date -d "$mydate" +%Y%m%d

会给你一个格式化的日期。您可以使用 $() 语法将结果分配给变量 - 运行 命令并分配结果

formattedDate=$(date -d "$mydate" +%Y%m%d)
echo $formattedDate