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
什么是有效的:
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