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

时间:2018-11-07 20:03:06

标签: bash shell awk parameter-passing double-quotes

我有一系列使用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来基于时间戳选择指定范围内的记录。双引号不能很好地发挥作用,因此我必须按如下所示对其进行转义以提取适当的行:

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

我想将时间戳记指定为我的Shell脚本的参数,而不是将其硬编码在脚本中,但是我还无法弄清楚如何将其移交给{{ 1}},尤其是在字段值中考虑必要的双引号时。

在我的awk脚本中,我尝试使用代表开始和结束范围的时间戳字符串创建变量bashts,然后在以后对{{1 }}。

st

这不起作用:

awk

这也不是:

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

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

  1. 如何在awk ' BEGIN { FS=","; ts=${ts}; st=${st} } $1>=st && $1<st { print $0 } ' $file.in > $file.out 命令中使用awk ' BEGIN { FS="," } $1>=${ts} && $1<${st} { print $0 } ' $file.in > $file.out 脚本参数(或bash变量)?
  2. 如何处理双引号作为字段值的一部分?

1 个答案:

答案 0 :(得分:2)

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

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

请注意,还使用-F初始化FS,并且您不需要{ print $0 },因为这是在条件为true时的默认操作。