我找到了一些方法来传递外部shell变量到awk脚本,但我对“和”感到困惑。

首先,我尝试了一个shell脚本:

$ v=123test
$ echo $v
123test
$ echo "$v"
123test

然后试试awk:

$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123

为什么会有这样的区别呢?

最后我尝试了这个:

$ awk 'BEGIN{print " '$v' "}'
$  123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1:             ^ unexpected newline or end of string 

我对此感到困惑。


当前回答

似乎完全没有提到老式的ENVIRON awk内置散列。用法示例:

$ X=Solaris awk 'BEGIN{print ENVIRON["X"], ENVIRON["TERM"]}'
Solaris rxvt

其他回答

专业提示

它可以方便地创建一个函数来处理这个问题,这样你就不必每次都输入所有内容。使用选定的解决方案,我们得到…

awk_switch_columns() {
     cat < /dev/stdin | awk -v a="$1" -v b="$2" " { t = \$a; \$a = \$b; \$b = t; print; } "
}

然后把它用作…

echo 'a b c d' | awk_switch_columns 2 4

Output:
a d c b

我只是改变了@Jotne的答案“for循环”。

for i in `seq 11 20`; do host myserver-$i | awk -v i="$i" '{print "myserver-"i" " $4}'; done

你可以使用ARGV:

v=123test
awk 'BEGIN {print ARGV[1]}' "$v"

注意,如果你要继续进入身体,你将需要调整 命令行参数个数:

awk 'BEGIN {ARGC--} {print ARGV[2], $0}' file "$v"

我必须在日志文件的开头插入日期,如下所示:

DATE=$(date +"%Y-%m-%d")
awk '{ print "'"$DATE"'", $0; }' /path_to_log_file/log_file.log

它可以重定向到另一个文件来保存

似乎完全没有提到老式的ENVIRON awk内置散列。用法示例:

$ X=Solaris awk 'BEGIN{print ENVIRON["X"], ENVIRON["TERM"]}'
Solaris rxvt