a:进程进通信
b:awk参数形式
c:shell命令解析,命令替换
等等,在此列举二三点例子,做为小结。以下主要分为二部分
1:shell给awk传参
2:awk往shell传参
参考文档:gnu 的awk documentation
http://www.gnu.org/software/gawk/manual/gawk.html#Language-History
===================================
第一部分,shell往awk传参
首先得理解下awk的二种变量,和三种参数(变量)附值形式
二种变量,这里指内部变量,和自定义变量(本文先不讨论awk的函数局部变量,后续有空补上)
和shell一样,awk也有一些内置的变量,如NR,NF等,变量的赋值了有各自的规则(不再展开,具体看awk文档各变量说明)
自定义变量,通常是为程序需要自身定义的变量,不具有像内置变量那样的作用。
这二类变量的附值,实际上并没多少差别,只是文档中有提到,对内置变量的附值,有可能会得到不期望的结果,有些是被接收的,有些是不被接受的(原文:Caution:
awk三种变量附值形式:
1:-v var=text
2:BEGIN模块
root@rac0
[root@rac0 tmp]# awk -f a.awk -v n=1 n=3
in begin ,n=1
3 5
3 55
3 555
2 a
2 b
2 c
in end n=2
看点:
1:-v,-f等option参数,不列入ARGV
2:-v的参数,要求在文件类参数(包括不加-v的var=text)之前
3:-v的效果,在BEGIN之前
4:n=3,n=2的效果
例子二:
比如要用awk计算某些单词在某些文件(列可能不同)出现个数,除了在程序里指定列,还可以在命令行里进行指定,简单而清晰
[root@rac0 tmp]# cat words1
fqef word4
wfww word3
[root@rac0 tmp]# cat words2
word4 aaa
word2 fwww
word1 fwwww
[root@rac0 tmp]# awk '{a[$n]++}END{for(b in a)print b,a[b]}' n=2words1 n=1 words2
word1 1
word2 1
word3 1
word4 2
===================
第二部分,awk传参数给shell
这个就涉及到进程间通信了,因为shell调用起来的awk实际的执行环境是shell脚本运行进程的一个子进程,子进程原则上除了继承到自身环境上的变量外,无法对父进程的环境进行访问和修改的,所以在awk里执行system()变量附值,也更也不了shell参数
那么,如何做?
之前在cu上有讨论过函数调用的变量附值 ,回帖粘过来,不再展开了呵
(函数对shell变量更改)通常可以用这么几个办法
1:用全局变量附值(这种方法不适用于awk,下边有描述)
var=
func(){ var=blabla; };
func
2:用命令替换附值
func(){ echo blabla; };
var=$(func)
3:eval
(注,在这个例子中倒显得有点烦索,其实eval一个经典的用法就是用来脚本之间传递参数用的,毕竟进程间环境无法相互涉及)
var=
fun(){ echo "var=blabla";};
cmd=$(fun)
eval $cmd
echo $var
4:ipc...
unix系最常用的ipc莫过于管道
下边有个例子,是以前以前用过的一个例子,用的是命名管道
[oracle@rac2 tmp]$ cat -n test.sh
注一:以上函数调用时增加参数不影响使用
注二:除了第一个方法:全局变量外,另外三种方法其实也广泛用到其他函数(如awk)更改shell变量值的应用上,因为subshell所在的子进程并不能更改到父进程的环境表,更改全局变量在这种情况下没效果。