向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
阅读(2206) | 评论(0) | 转发(0) |