awk调用函数---内部定义函数和外部shell定义函数

背景

在处理数据的时候对于一些文本需要做预处理;或者这些文本是通过一系列的处理演变得出;这些都写在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

原文连接

你可能感兴趣的:(Linux,shell)