【问题标题】:Passing quoted string arguments to awk from within a bash script [duplicate]从bash脚本中将带引号的字符串参数传递给awk [重复]
【发布时间】:2018-11-07 20:03:05
【问题描述】:

我有一系列使用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 脚本的参数,而不是将它们硬编码在脚本中,但是我无法弄清楚如何将此移交给 @987654326 @ 在脚本中,尤其是在考虑字段值中必要的双引号时。

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

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

这不起作用:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!我刚刚阅读了有关awk 的更多信息,并找到了-v 选项,看起来这可以完成工作。
    猜你喜欢
    • 2014-04-13
    • 2016-09-15
    • 1970-01-01
    • 2014-06-11
    • 2012-01-23
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多