从 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
脚本中,我尝试用表示开始和结束边界的时间戳字符串创建变量 ts
和 st
,然后在稍后调用 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
我怀疑这里可能有两个问题:
- 如何在我的
awk
命令中使用 bash
脚本参数(或 bash
变量)?
- 如何将双引号作为字段值的一部分处理?
变量不会在单引号内展开。正确的方法是使用-v
选项到awk
来初始化变量:
awk -v ts="$ts" -v st="$st" -F, ' >= st && < st' "$file.in" > "$file.out"
请注意,还使用 -F
来初始化 FS
,并且您不需要 { print [=15=] }
,因为这是条件为真时的默认操作。
我有一系列使用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
脚本中,我尝试用表示开始和结束边界的时间戳字符串创建变量 ts
和 st
,然后在稍后调用 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
我怀疑这里可能有两个问题:
- 如何在我的
awk
命令中使用bash
脚本参数(或bash
变量)? - 如何将双引号作为字段值的一部分处理?
变量不会在单引号内展开。正确的方法是使用-v
选项到awk
来初始化变量:
awk -v ts="$ts" -v st="$st" -F, ' >= st && < st' "$file.in" > "$file.out"
请注意,还使用 -F
来初始化 FS
,并且您不需要 { print [=15=] }
,因为这是条件为真时的默认操作。