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")}'

 

shell生成随机字符串

  1. 生成随机数
    [root@73 ~]# echo $RANDOM

    注:得到的这个数是小于或等于5位的整数。

  2. 生成随机字符串
    [root@73 ~]# head -n 5 /dev/urandom |sed 's/[^a-Z0-9]//g'|strings -n 4
    [root@73 ~]# head -n 5 /dev/urandom |strings -n 5
    [root@73 ~]# openssl passwd -stdin < <(echo)
  3. 从指定字符集和中生成随机字符串
    #!/bin/bash
    MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+="
    LENGTH="9"
    while [ "${n:=1}" -le "$LENGTH" ]
    do
        PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
        let n+=1
    done
    echo "$PASS" 
    exit 0
  4. 通过时间获得随机数(date)
    [root@node3 test]# date +%s%N
  5. 通过系统内部唯一数据生成随机数(/dev/random,urandom)
    [root@node3 test]# head -1 /dev/urandom

    注:产生的是二进制所以显示乱码

    [root@node3 test]# head -20 /dev/urandom | cksum
  6. 读取linux的uuid码
    [root@node3 test]# cat /proc/sys/kernel/random/uuid | cksum | cut -f1 -d " "