在bash脚本中向awk传递带引号的字符串参数
我有一系列日志文件,使用在bash脚本中向awk传递带引号的字符串参数,bash,shell,awk,parameter-passing,double-quotes,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.17
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
这不起作用:
awk '
BEGIN { FS=","; ts=${ts}; st=${st} }
$1>=st && $1<st { print $0 }
' $file.in > $file.out
awk'
开始{FS=“,”ts=${ts};st=${st}
$1>=st&&$1=${ts}&&$1变量不在单引号内展开。正确的方法是使用-v
选项awk
初始化变量:
awk -v ts="$ts" -v st="$st" -F, '$1 >= st && $1 < st' "$file.in" > "$file.out"
awk-v ts=“$ts”-v st=“$st”-F,$1>=st&$1“$file.out”
请注意,使用-F
初始化FS
,您不需要{print$0}
,因为这是条件为真时的默认操作。变量不会在单引号内展开。正确的方法是使用-v
选项awk
初始化变量:
awk -v ts="$ts" -v st="$st" -F, '$1 >= st && $1 < st' "$file.in" > "$file.out"
awk-v ts=“$ts”-v st=“$st”-F,$1>=st&$1“$file.out”
请注意,使用-F
初始化FS
,您不需要{print$0}
,因为这是条件为真时的默认操作。谢谢!我刚刚阅读了更多关于awk
的内容,找到了-v
选项,看起来这就可以了。谢谢!我刚刚阅读了更多关于awk
的内容,找到了-v
选项,看起来这就可以了。
awk -v ts="$ts" -v st="$st" -F, '$1 >= st && $1 < st' "$file.in" > "$file.out"