match()中带有日期正则表达式的Shell变量

match()中带有日期正则表达式的Shell变量,shell,awk,Shell,Awk,在shell脚本中,我有几个变量: last_month=$(date +%m -d "-1 month") year=$(date +%Y -d "-1 month") 文件中的第三个字段(日期)(使用“|”作为分隔符)必须匹配: awk -v awk_last_month="$last_month" -v awk_year="$year" -i inplace 'BEGIN {FS=OFS="|"} match($3,/^[0-9]+\/awk_last_month\/awk_year/)

在shell脚本中,我有几个变量:

last_month=$(date +%m -d "-1 month")
year=$(date +%Y -d "-1 month")
文件中的第三个字段(日期)(使用“|”作为分隔符)必须匹配:

awk -v awk_last_month="$last_month" -v awk_year="$year" -i inplace 'BEGIN {FS=OFS="|"} match($3,/^[0-9]+\/awk_last_month\/awk_year/)' "$export_name"

我确信该字段有(很多!)个匹配行,并且我做了一些测试,让AWK打印传入的变量(AWK_last_month和AWK_year):它确实打印它们,但当它们在match()中使用时,匹配失败,我最终得到一个空文件。我认为这与日期斜杠()有关,但根据上面的代码,它们是转义的。

斜杠之间的内容是一个没有变量访问权限的文本正则表达式;但是
match()
的第二个参数可以是一个字符串,您可以通过常规Awk机制将变量插入其中,即

match($3, "^[0-9]+\/" awk_last_month "\/" awk_year)


或者该语言本身提供的无数其他字符串操作。

斜杠之间的内容是一个无法访问变量的文本正则表达式;但是
match()
的第二个参数可以是一个字符串,您可以通过常规Awk机制将变量插入其中,即

match($3, "^[0-9]+\/" awk_last_month "\/" awk_year)


或者该语言本身提供的无数其他字符串操作。

您能提供带有预期输出的示例输入吗?您能提供带有预期输出的示例输入吗谢谢您共享了漂亮的命令,非常好地使用了
sprintf
不知道它可以在match内部使用,非常感谢您的分享,先生。我们可以在所有类型的
awk
s中使用这个
sprintf
?或者它是特定于任何
awk
,请您澄清一下。它在中,但许多较小的awk没有实现完整的POSIX规范。但是,如果您有
printf
,技术上很容易,所以我看没有理由任何实现都会遗漏它。感谢您共享nice命令,非常好地使用了
sprintf
不知道它可以在比赛中使用,非常感谢您的分享,先生。我们可以在所有类型的
awk
s中使用这个
sprintf
?或者它是特定于任何
awk
,请您澄清一下。它在中,但许多较小的awk没有实现完整的POSIX规范。但是,如果您有
printf
,技术上非常简单,因此我认为任何实现都没有理由遗漏它。