我有一系列使用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
脚本中,我尝试使用代表开始和结束范围的时间戳字符串创建变量bash
和ts
,然后在以后对{{1 }}。
st
这不起作用:
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
脚本参数(或bash
变量)?答案 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时的默认操作。