gawk捕获外部命令输出到变量

awk执行外部命令或外部自定义函数返回的是一个状态码,如果要把外部命令的输出保存到awk的变量很不容易,经过一番研究终于搞定。

gawk 'BEGIN {FS=",";OFS=","} {"rand_str '$i'"|getline randStr;$2=$2"_"randStr;print $2;close("rand_str '$i'")}' $dumpFile

rand_str是shell中定义的一个产生随机字符串的函数,参数指定随机串的长度。awk的getline函数获取输出并保存到变量randStr,最后需要awk的close函数关闭命令产生的输出流,否则randStr的值会保持不变!

#!/bin/bash
test(){
    echo $RANDOM 
}
export -f test 
echo -e "1\n2"|gawk 'BEGIN {FS=",";OFS=",";} {a="'"`test`"'";print a;}'

这样也可以实现,但是gawk处理每一行的时候a的值都是第一次的值,没有找到处理一行执行一次test()的方法。

gawk使用外部shell环境变量

  1. "'$var'"
    这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:
    var="test"
    awk 'BEGIN{print "'$var'"}'这种写法其实际是双引号变为单引号的常量,传递给了awk.
    如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
    var="this is a test"
    awk 'BEGIN{print "'"$var"'"}'
  2. '"$var"'
    这种写法与上一种类似.如果变量含空格,则变为'""$var""'较为可靠.
  3. 使用-v选项,如:
    $var="this is a test"
    awk -vnvar="$var" '{print nvar}'这样便把系统变量定义成了awk变量.

gawk执行外部自定义函数

gawk可以调用系统命令和外部脚本,但是shell脚本中的自定义函数默认无法调用,可以使用export命令实现。

#!/bin/bash
#生成随机字符串
function rand_str(){
    MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    while [ "${n:=1}" -le "$1" ]
    do
        PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
        let n+=1
    done    
    echo "$PASS" 
}

export -f rand_str;
echo 1|gawk '{system("rand_str 10")}'

 

Linux Shell函数简介

1.定义函数

语法:
[ function ] funname [()]
{
action;
[return int;]
}
说明:

  1. 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数,function关键字和()必须有其中一个。
  2. 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)。

继续阅读