从 bash 脚本中将带引号的字符串参数传递给 awk

Passing quoted string arguments to awk from within a bash script

我有一系列使用csv格式的日志文件,每行的第一个字段由双引号括起来的时间戳组成,如下所示:

"2018-10-12 00:08:28",248351,1659.912,1.145031,6.180728
"2018-10-13 02:14:16",248486,243.657,0.513548,9.661507
"2018-10-13 22:31:52",248920,1014.364,0.357985,4.153846
"2018-10-14 06:19:31",249035,629.172,1.668043,8.029534

我正在使用bash脚本来操作这些日志文件,并根据时间戳在指定范围内包括awk到select条记录。双引号不能很好地播放所以我必须如下转义它们以提取适当的行:

awk '
    BEGIN { FS=","; ts="\"2018-10-13 00:00:00\""; st="\"2018-10-14 00:00:00\"" }
    >=ts && <st { print [=12=] }
' $file.in > $file.out

我想改为将时间戳指定为我的 shell 脚本的参数,而不是将它们硬编码在脚本中,但是我一直无法弄清楚如何做到这一点在脚本中移交给 awk,尤其是在考虑字段值中必要的双引号时。

在我的 bash 脚本中,我尝试用表示开始和结束边界的时间戳字符串创建变量 tsst,然后在稍后调用 awk

ts="\"2018-10-13 00:00:00\""
st="\"2018-10-14 00:00:00\""

这行不通:

awk '
    BEGIN { FS=","; ts=${ts}; st=${st} }
    >=st && <st { print [=14=] }
' $file.in > $file.out

这也不行:

awk '
    BEGIN { FS="," }
    >=${ts} && <${st} { print [=15=] }
' $file.in > $file.out

我怀疑这里可能有两个问题:

  1. 如何在我的 awk 命令中使用 bash 脚本参数(或 bash 变量)?
  2. 如何将双引号作为字段值的一部分处理?

变量不会在单引号内展开。正确的方法是使用-v选项到awk来初始化变量:

awk -v ts="$ts" -v st="$st" -F, ' >= st &&  < st' "$file.in" > "$file.out"

请注意,还使用 ​​-F 来初始化 FS,并且您不需要 { print [=15=] },因为这是条件为真时的默认操作。