【问题标题】:problem with shell variables in awkawk中的shell变量问题
【发布时间】:2011-09-26 08:39:22
【问题描述】:

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

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}

当我在脚本中没有 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 标志无法提供正确的输出

【问题讨论】:

  • awk --v。另外,这与shell变量有什么关系吗?如果不替换变量直接调用它会起作用吗?

标签: shell unix awk


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以尝试在你的脚本中使用 nawk
    • 至少错误消失了 :) 我想/d1 d2/ 并不意味着你所期望的。如果您需要动态正则表达式,则需要使用如下内容:$0 ~ d1 " " d2
    • 我观察到该命令没有返回任何输出。: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]&gt;=t1 &amp;&amp; a[1]a[2]&lt;=t2)print $9}'
    • 您是否尝试将/d1 d2/ 更改为$0 ~ d1 " " d2
    • @Dimitre,你有正确的答案$0 ~ d1 " " d2:将其发布为获得适当信用的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2014-01-04
    • 2014-01-20
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多