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

  显示原文与译文双语对照的内容
0 0

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


$root#./myscript -v 31 12

但我似乎找不到任何合适的方法将 命令行 参数传递到bash变量X 中的jstl命令,而不使用脚本。 我尝试了双引号以允许变量插值,以反斜杠在堆栈溢出的它的他位置转义它的他元素。


#!/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 Solaris不接受-v标志,而且这个特定的错误 telegraphed somewhat somewhat 。 用nawk进行了切换,它运行得很好。 @David_W 对 nawk/awk参数传递的一些细节进行了。 很多感谢 @Ed_Morton 为Proof-of-concepts确定错误和 @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")

时间: 原作者:

0 0

根据 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允许你通过调用来使用更新的版本,或者使用 /usr/xpg4/bin ( 我建议在 /bin/usr/bin 之前放入 $PATH ) 。 这样,其他操作系统( 如 Mac OS X 和 Linux )的shell 脚本更可能以兼容的方式工作。

从 Solaris XPG4 ( 节 5 ) 手册手册中:

If POSIX.2a,,SUS,SUSv2,POSIX.2,,,,If,If,If,If,If,If,If,If 。 如果应用程序希望利用 POSIX.2, POSIX.2a, XPG4,SUS或者SUSv2特性,应在找到指定的实用程序的任何目录之前设置 PATH ( sh 或者 ksh ) 或者 PATH ( csh ) 环境变量,例如 /bin/usr/bin/usr/ccs/bin

原作者:
0 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")

原作者:
...