Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash脚本中向awk传递带引号的字符串参数_Bash_Shell_Awk_Parameter Passing_Double Quotes - Fatal编程技术网

在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"