将Bash参数传递给封装AWK命令的Bash变量

时间:2014-07-22 10:59:55

标签: linux bash shell awk solaris

我需要能够运行脚本并传入参数(日期和月份),如

$root# ./myscript -v 31 12

但我似乎无法找到任何适当的方法将命令行参数传递给bash变量X中的awk命令而不会导致脚本阻塞。我已尝试使用双引号来允许变量插值,如Stack Overflow中其他地方所述,使用反斜杠转义其他美元符号,但无济于事。

#!/bin/bash
X=$(./some_script | awk -v VARIABLE="$1" '$1 == "VARIABLE" | awk '{print $1,$2,$3}')
Y=$(./other_script | awk -v VARIABLE="$2" '$1 == "VARIABLE" | awk '{print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")

这会阻塞脚本并返回错误

awk: syntax error near line 1 
awk: bailing out near line 1

解决 似乎标准的Solaris'AWK'不接受-v标志,并且该特定错误会在某种程度上对其进行电报。用nawk切换它,它运行良好,如下所述。 @David_W详细介绍了nawk / awk参数传递。非常感谢@Ed_Morton发现错误,感谢@anubhava和@ hek2mgl的概念验证。

#!/bin/bash
echo
X=$(./some_script | nawk -v VARIABLE="$1" '$1 == "VARIABLE" {print $1,$2,$3}')
X=$(./other_script | nawk -v VARIABLE="$1" '$1 == "VARIABLE" {print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")

2 个答案:

答案 0 :(得分:1)

根据awk的版本,有两种方法将环境变量传递到awk

较新版本的awk(在Solaris系统上有时称为nawk):

$ awk -v var1="$var1" -v var2="$var2" prog.awk

旧版本的awk让你在最后设置变量:

$ awk prog.awk var1="$var1" var2="$var2"

我不能100%确定最后一个是否完全符合它的要求。 20多年来,我还没有使用awk的旧版本。甚至Solaris允许您通过调用awk代替nawk或使用/usr/xpg4/bin中的$PATH来使用较新版本的/bin(我建议您先放入/usr/bin /usr/xpg4/binPATH。这样,来自其他操作系统(如Mac OS X和Linux)的shell脚本更有可能以兼容的方式工作。)

从Solaris XPG4(第5节)联机帮助页:

  

如果POSIX.2,POSIX.2a,XPG4,SUS或SUSv2所需的行为与历史Solaris实用程序行为冲突,则该实用程序的原始Solaris版本将保持不变; sh中提供了符合标准的新版本。对于希望利用POSIX.2,POSIX.2a,XPG4,SUS或SUSv2功能的应用程序,kshpathcsh)或/usr/xpg4/bin({ {1}})环境变量应该在/bin之前设置在找到这些规范指定的实用程序的任何其他目录之前,例如/usr/bin/usr/ucb/usr/ccs/bin,和{{1}}。

答案 1 :(得分:0)

您可以使用awk -v name=val将参数从shell传递给awk

试试这个:

#!/bin/bash
X=$(./some_script | awk -v val="HARDCODED" '$1 == val {print $1,$2,$3}')
Y=$(./some_other_script | awk -v val="HARDCODED" '$1 == val {print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")