awk中shell变量的问题

时间:2011-09-26 08:39:22

标签: shell unix awk

我有一个在命令行上成功执行的命令:

ls -l | awk '/Sep 26/{split($8,a,":");if(a[1]a[2]>=1045 && a[1]a[2]<=1145)print $9}'

我在下面的shell脚本中包含了相同的内容:

#!/bin/ksh

date1=$1
date2=$2
time1=$3
time2=$4
ls -l| awk -v d1=${date1} -v d2=${date2}  -v t1=${time1} -v t2=${time2} '/d1 d2/{split($8,a,":");if(a[1]a[2]>=t1 && a[1]a[2]<=t2) print $9}'

但是这不起作用。请参阅下面的执行

ksh -vx test.sh Sep 26 1045 1145
#!/bin/ksh

date1=$1
+ date1=Sep
date2=$2
+ date2=26
time1=$3
+ time1=1045
time2=$4
+ time2=1145
ls -l| awk -v d1=${date1} -v d2=${date2}  -v t1=${time1} -v t2=${time2} '/d1 d2/{split($8,a,":");if(a[1]a[2]>=t1 &&a[1]a[2]<=t2)print $9}'
+ awk -v d1=Sep -v d2=26 -v t1=1045 -v t2=1145 /d1 d2/{split($8,a,":");if(a[1]a[2]>=t1 &&a[1]a[2]<=t2)print $9}
+ ls -l
awk: syntax error near line 1
awk: bailing out near line 1

我正在使用Solaris OS:我现在尝试使用nawk,但没有错误,但也没有输出。

pearl[ncm_o11.2_int.@].293> ksh -vx test.sh Sep 26 1045 1145
#!/bin/ksh

date1=$1
+ date1=Sep
date2=$2
+ date2=26
time1=$3
+ time1=1045
time2=$4
+ time2=1145
ls -l| nawk -v d1=${date1} -v d2=${date2}  -v t1=${time1} -v t2=${time2} '/d1 d2/{split($8,a,":");if(a[1]a[2]>=t1 &&a[1]a[2]<=t2)print $9}'
+ ls -l
+ nawk -v d1=Sep -v d2=26 -v t1=1045 -v t2=1145 /d1 d2/{split($8,a,":");if(a[1]a[2]>=t1 &&a[1]a[2]<=t2)print $9}

当我执行script.its中的shell变量执行完美时。

* 注意: *我正在使用Solaris OS。

我发现问题在于shell脚本中的最终框架命令:

ls -l|nawk -v d1=Sep -v d2=26 -v t1=1045 -v t2=1145 '/d1 d2/{split($8,a,":");if(a[1]a[2] >=t1 && a[1]a[2]<=t2)print $9}'

但是我不确定为什么没有用-v标志给出正确的输出

2 个答案:

答案 0 :(得分:2)

如上所述,如果您需要动态正则表达式,则需要使用$0 ~ d1 " " d2代替/d1 d2/

答案 1 :(得分:0)

哪个操作系统?当您以交互方式运行命令时, awk 可能指向不同的 awk 实现。例如,如果您在 Solaris 上,请尝试使用 nawk (或 gawk )运行脚本,而不是 awk