2011-09-26 123 views
0

我有成功在命令行下執行命令:問題與AWK shell變量

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}' 

但這不work.please看到下面的執行

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操作系統:我現在已經與NAWK嘗試,但有沒有錯誤,但也沒有輸出。

pearl[[email protected]].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} 

當我正在執行完內部腳本中的shell變量。

* 注意: *我正在使用Solaris操作系統。

我想通了,問題就出在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標誌

+0

'awk --v'。此外,這與shell變量有什麼關係?如果你直接調用它而沒有變量替換,它會起作用嗎? –

回答

0

哪些工作系統?當您以交互方式運行命令時,有可能會指向不同的awk實現。如果你在的Solaris,例如,嘗試用NAWK(或GAWK)上運行,而不是AWK腳本。

+0

是的,我正在使用Solaris – Vijay

+0

因此,請在腳本中使用* nawk *。 –

+0

我粘貼了nawk輸出,但它也不起作用 – Vijay

2

如前所述,如果您需要動態正則表達式,則需要使用$0 ~ d1 " " d2而不是/d1 d2/