在awk中使用冒号的shell脚本参数

时间:2011-09-22 14:36:30

标签: linux shell awk

我有一个文件,其中包含具有以下格式的行:

2011/09/14 12:00:23.525 text

我编写了一个shell脚本,用于在 text 中搜索给定的表达式,并按日期和时间对所有匹配的行进行排序。最后,我想丢弃引用一个比参数传递的更早的条目。我使用awk进行这种过滤。脚本如下所示:

search=$1  file=$2  day=$3  time=$4
zgrep -h "$search" $file | sort -k1,1 -k2,2 | awk -v da="$day" ti="$time" '($1 >= day) && ($2>= ti) {print $0}' > out.$$

如果我调用:

myScript searchThis file1.txt 2011/09/20 09:16:52.130 

我收到此错误:

awk: ti=09:16:52.130
awk:      ^ syntax error
你能帮我解决这个问题吗? 非常感谢! 再见

2 个答案:

答案 0 :(得分:1)

你可以将para值包装在"中吗? 我在bash和zsh下进行了测试,两者都有效:

kent$  cat a
2011/09/20 09:16:52.130 
2011/08/20 10:16:52.130 
2011/07/20 05:16:52.130

kent$  d="2011/08/30 00:23:23"   #here used ".." to wrap the date and time

kent$  awk -v d="$d" '$0>d' a
2011/09/20 09:16:52.130

不知道是否有帮助...

答案 1 :(得分:0)

肯特的回答对我不起作用。我在cygwin中使用GNU Awk 4.1.3。

我最终找到了这个awk: passing variables from bash,其中dubiousjim提到你可以在动作后指定变量值。它不会在BEGIN规则中出现,但对我的情况来说这很好。

因此,您可以将脚本更改为:

search=$1  file=$2  day=$3  time=$4
zgrep -h "$search" $file | sort -k1,1 -k2,2 | awk '($1 >= day) && ($2>= ti) {print $0}' da="$day" ti="$time" > out.$$