背景
在处理数据的时候对于一些文本需要做预处理;或者这些文本是通过一系列的处理演变得出;这些都写在awk中一是程序显得臃肿混乱,二是耦合性太强。
shell函数
先温习一下普通shell的写法
[root@wmstianjin16172 ~]# vim funComm.sh
#!/bin/bash
#编写shell function输出结果可以使用变量进行接收,然后处理
function funComm()
{
if [ -z "$1" ]
then
echo 0
else
echo 1
fi
}
#编写shell function使用return可以使用最后退出状态获取处理
function funComm2()
{
if [ -z "$1" ]
then
return 0
else
return 1
fi
}
funComm2 x
if [ $? -eq 1 ]
then
echo "funcomm2NotNull"
else
echo "funcomm2Null"
fi
if [ `funComm2 x` $? -eq 1 ]
then
echo "funcomm2NotNull"
else
echo "funcomm2Null"
fi
if [ `funComm xxx` -eq 1 ]
then
echo "funCommNotNull"
else
echo "funCommNull"
fi
调试运行结果如下:
[root@wmstianjin16172 ~]# bash -x funComm.sh
+ funComm2 x
+ '[' -z x ']'
+ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm2 x
++ '[' -z x ']'
++ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm xxx
++ '[' -z xxx ']'
++ echo 1
+ '[' 1 -eq 1 ']'
+ echo funCommNotNull
funCommNotNull
以上的普通函数包含几个知识点
1、函数定义格式
2、比较的用法
3、函数调用方法
4、分支控制
可以参考shell基础
awk调用内部定义函数
在博客GNU awk介绍中已经有示例我直接拿过来用 GNU awk示例连接
[root@wmstianjin16172 ~]# awk 'function fun(a,b){return a+b}BEGIN{print fun(1,2)}'
3
这是awk调用自己内部定义的函数
awk调用外部定义函数
awk中如果需要调用shell函数需要将函数export为系统参数,然后调用的时候用system;
[root@wmstianjin16172 ~]# cat funComm.sh
#!/bin/bash
function funComm()
{
if [ -z "$1" ]
then
echo 0
else
echo 1
fi
}
function funComm2()
{
if [ -z "$1" ]
then
return 0
else
return 1
fi
}
funComm2 x
if [ $? -eq 1 ]
then
echo "funcomm2NotNull"
else
echo "funcomm2Null"
fi
if [ `funComm2 x` $? -eq 1 ]
then
echo "funcomm2NotNull"
else
echo "funcomm2Null"
fi
if [ `funComm xxx` -eq 1 ]
then
echo "funCommNotNull"
else
echo "funCommNull"
fi
export -f funComm
awk 'BEGIN{
printf "awk call shell function: "
_value=system("funComm x")
if(_value == "0")
{
print "awk funComm not null"
}
else
{
print "awk funComm null"
}
}'
exit
调试运行结果如下:
[root@wmstianjin16172 ~]# bash -x funComm.sh
+ funComm2 x
+ '[' -z x ']'
+ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm2 x
++ '[' -z x ']'
++ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm xxx
++ '[' -z xxx ']'
++ echo 1
+ '[' 1 -eq 1 ']'
+ echo funCommNotNull
funCommNotNull
+ export -f funComm
+ awk 'BEGIN{
printf "awk call shell function: "
_value=system("funComm x")
if(_value == "0")
{
print "awk funComm not null"
}
else
{
print "awk funComm null"
}
}'
awk call shell function: 1
awk funComm not null
+ exit