我有一个文件,其中包含具有以下格式的行:
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
你能帮我解决这个问题吗?
非常感谢!
再见
答案 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.$$