繁体   English   中英

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

[英]Passing Bash argument into Bash Variable encapsulating AWK Command

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

$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")

有路过的环境变量分为两种方式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也允许您通过调用nawk或在/usr/xpg4/bin使用一个版本来使用较新版本的awk (建议将其放在/bin/usr/bin之前的$PATH 。) ,则其他操作系统(例如Mac OS X和Linux)的shell脚本更可能以兼容的方式工作。)

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

如果POSIX.2,POSIX.2a,XPG4,SUS或SUSv2所需的行为与历史Solaris实用程序行为发生冲突,则该实用程序的原始Solaris版本不会更改; /usr/xpg4/bin提供了符合标准的新版本。 对于希望利用POSIX.2,POSIX.2a,XPG4,SUS或SUSv2功能的应用程序,应在/usr/xpg4/bin之前设置/usr/xpg4/bin设置PATHshksh )或pathcsh )环境变量可以找到由那些规范指定的实用程序的目录,例如/bin/usr/bin/usr/ucb/usr/ccs/bin

您可以使用awk -v name=val从外壳将参数传递给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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM