在具有日期正则表达式的match()中使用Shell变量

时间:2019-07-11 09:07:53

标签: 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/)' "$export_name"

我确定该字段具有(很多!)匹配行,并且我进行了一些测试,以使AWK打印传入的变量(awk_last_month和awk_year):确实会打印'em,但是当它们在match()中使用时)匹配失败,最后我得到一个空文件。我认为这与日期斜杠(https://unix.stackexchange.com/questions/120788/pass-shell-variable-as-a-pattern-to-awk)有关,但是根据上面的代码,它们已转义。

1 个答案:

答案 0 :(得分:2)

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

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

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

或语言本身可用的其他许多字符串操作操作。