向awk传递外部参数的方法有四:
(一)直接传递
参数写在输入文本之前,脚本之后
awk 'Script' var=value inputfile #单个参数
awk -f scriptfile var1=value1 var2=value2 inputfile #多个参数
缺点:命令行参数的限制是他们在BEGIN过程中是不可用的,直到首行输入完成以后它们才可用。BEGIN是在首行输入前执行。
$ echo | awk 'BEGIN{print n}' n=1
# 此命令打印出空,并没有打印1
(二)-v选项
-v 选项,指定在任何输入被读入前定义参数 #指定执行BEGIN前的变量赋值
例子:
awk -v var=value inputfile
$ echo | awk -v n=1 'BEGIN{print n}'
1
(三)系统内置变量ARGV数组
ARGV[N],ARGV[0]为awk,下标从1开始是输入的参数。
例子:
$ echo | awk 'BEGIN{print ARGV[0]}' var1
awk
$ echo | awk 'BEGIN{print ARGV[1]}' var1 var2
var1
$ echo | awk 'BEGIN{print ARGV[2]}' var1 var2
var2
(四)间接引用 \$${VAR}
间接变量引用避免了在一个内嵌awk脚本中引用shell变量的混乱行为
例子:
#!/bin/bash
# 这是" 求文件中指定列的总和" 脚本的另一个版本,
#+ 这个脚本可以计算目标文件中指定列( 此列的内容必须都是数字) 的所有数字的和.
# 这个脚本使用了间接引用.
ARGS=2
E_WRONGARGS=65
if [ $# -ne "$ARGS" ] # 检查命令行参数的个数是否合适.
then
echo "Usage: `basename $0` filename column-number"
exit $E_WRONGARGS
fi
filename=$1
column_number=$2 ######使用时指定计算列数######
# awk脚本开始.
# ------------------------------------------------
awk " #注意此处为双引号
{ total += \$${column_number} # 间接引用,先将列数的变量替换得到$N,$N对应awk的列数
}
END {
print total
}
" "$filename"
# ------------------------------------------------
# awk脚本结束.
exit 0
另一解决办法:
awk -v N=$column_number " #传递了column_number给N变量到awk中
{ total += \$N # N 先替换为变量$column-number指定数字,再执行$number执行列数
}
END {
print total
}
" "$filename"
# ------------------------------------------------
# awk脚本结束.
(五)export结合ENVIRON变量
#!/bin/bash
# 这是" 求列的和" 脚本的另外一个版本(col-totaler.sh)
# 这个版本将把一个变量通过export的形式传递到'awk' 中 . . .
#+ 并且把awk脚本放到一个变量中.
ARGS=2
E_WRONGARGS=65
if [ $# -ne "$ARGS" ] # 检查命令行参数的个数.
then
echo "Usage: `basename $0` filename column-number"
exit $E_WRONGARGS
fi
filename=$1
column_number=$2
#===== 上边的这部分, 与原始脚本完全一样 =====#
export column_number
# 将列号export出来, 这样后边的进程就可用了.
# -----------------------------------------------
awkscript='{ total += $ENVIRON["column_number"] }
END { print total }'
# 是的, 变量可以保存awk脚本.
# -----------------------------------------------
# 现在, 运行这个awk脚本.
awk "$awkscript" "$filename"
exit 0
阅读(5363) | 评论(0) | 转发(0) |