awk中的shell变量问题

awk中的shell变量问题,shell,unix,awk,Shell,Unix,Awk,我有一个在命令行上成功执行的命令: ls -l | awk '/Sep 26/{split($8,a,":");if(a[1]a[2]>=1045 && a[1]a[2]<=1145)print $9}' ls-l|awk'/Sep 26/{split($8,a,“:”);如果(a[1]a[2]>=1045&&a[1]a[2]=t1&&a[1]a[2]=t1&&a[1]a[2]=t1&&a[1]a[2]哪个操作系统?当以交互方式运行命令时,awk可能指向不同的awk

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

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

ls-l|awk'/Sep 26/{split($8,a,“:”);如果(a[1]a[2]>=1045&&a[1]a[2]=t1&&a[1]a[2]=t1&&a[1]a[2]=t1&&a[1]a[2]哪个操作系统?当以交互方式运行命令时,awk可能指向不同的awk实现。例如,如果您在Solaris上,请尝试使用nawk(或gawk)运行脚本,而不是awk。

如前所述,如果需要动态正则表达式,则需要使用
$0~d1“”d2
而不是
/d1 d2/

awk--v
。此外,这与shell变量有关吗?如果直接调用它而不替换变量,它是否有效?因此请尝试在脚本中使用nawk。至少错误消失了:)我想,
/d1 d2/
并不是你所期望的。如果你需要一个动态正则表达式,你需要使用这样的东西:
$0~d1”d2
。我观察到命令没有返回任何输出。
ls-l | nawk-vd1=Sep-vd2=26-vt1=1045-vt2=1145'/d1 d2/{split($8,a,“:”);If(a[1]a[2]>=t1&[1]a[2]a[2]您是否尝试将
/d1 d2/
更改为
$0~d1”“d2
?@Dimitre,您使用
$0~d1”“d2
获得了正确答案:将其作为答案发布以获得适当的积分。
#!/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
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}
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}'