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

标签 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")

最佳答案

根据 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 中。这样,来自其他操作系统的 shell 脚本如Mac OS X 和 Linux 更有可能以兼容的方式工作。)

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

If the behavior required by POSIX.2, POSIX.2a, XPG4, SUS, or SUSv2 conflicts with historical Solaris utility behavior, the original Solaris version of the utility is unchanged; a new version that is standard-conforming has been provided in /usr/xpg4/bin. For applications wishing to take advantage of POSIX.2, POSIX.2a, XPG4, SUS, or SUSv2 features, the PATH (sh or ksh) or path (csh) environment variables should be set with /usr/xpg4/bin preceding any other directories in which utilities specified by those specifications are found, such as /bin, /usr/bin, /usr/ucb, and /usr/ccs/bin.

关于linux - 将 Bash 参数传递给封装 AWK 命令的 Bash 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24885539/

相关文章:

c# - 如何从 C# 应用程序向树莓派发送终端命令

regex - 简单的 Bash 和 RegEx 问题

iphone - 如何检测网络上的 iPhone?

linux - 如何调用位于其他目录的Makefile?

linux - bash echo 到另一个文件不工作

Linux计算机之间的文件同步

php - 为什么我的 PHP cron 脚本不播放声音?

linux - Bash 文本解析高尔夫

Linux Shell "Variable"用于文件输入 "<"

linux - 增加一个ip地址的并发连接数