我找到了一些方法来传递外部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 

我对此感到困惑。


当前回答

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

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

其他回答

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

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

你可以在命令行选项-v中传入一个变量名(v)和一个环境变量的值(=)("${v}"):

% awk -vv="${v}" 'BEGIN { print v }'
123test

或者更清楚地说(用更少的vs):

% environment_variable=123test
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }'
123test

我只是改变了@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"