美文网首页
linux三剑客---awk

linux三剑客---awk

作者: 冯艳辉brook | 来源:发表于2018-05-03 18:16 被阅读0次

    1、介绍

            awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势

    2、语法

    awk [options] 'script' var=value file(s)

    awk [options] -f scriptfile var=value file(s)

    -F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:

    -v var=value   赋值一个用户定义变量,将外部变量传递给awk

    -f scripfile  从脚本文件中读取awk命令

    -m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目

    2、awk工作原理

    awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

    第一步:执行BEGIN{ commands }语句块中的语句;

    第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

    第三步:当读至输入流末尾时,执行END{ commands }语句块。

    3、使用

    echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'

    v1=v2=v3

    cat a.js

    1

    2

    3

    awk 'BEGIN{print "start"} {a+=$1} END{print a}' b.js

    start

    6

    4、内置变量

    说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

    $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。

    $0 这个变量包含执行过程中当前行的文本内容。

    [N] ARGC 命令行参数的数目。

    [G] ARGIND 命令行中当前文件的位置(从0开始算)。

    [N] ARGV 包含命令行参数的数组。

    [G] CONVFMT 数字转换格式(默认值为%.6g)。

    [P] ENVIRON 环境变量关联数组。

    [N] ERRNO 最后一个系统错误的描述。

    [G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。

    [A] FILENAME 当前输入文件的名。

    [P] FNR 同NR,但相对于当前文件。

    [A] FS 字段分隔符(默认是任何空格)。

    [G] IGNORECASE 如果为真,则进行忽略大小写的匹配。

    [A] NF 表示字段数,在执行过程中对应于当前的字段数。

    [A] NR 表示记录数,在执行过程中对应于当前的行号。

    [A] OFMT 数字的输出格式(默认值是%.6g)。

    [A] OFS 输出字段分隔符(默认值是一个空格)。

    [A] ORS 输出记录分隔符(默认值是一个换行符)。

    [A] RS 记录分隔符(默认是一个换行符)。

    [N] RSTART 由match函数所匹配的字符串的第一个位置。

    [N] RLENGTH 由match函数所匹配的字符串的长度。

    [N] SUBSEP 数组下标分隔符(默认值是34)。

    1)每行的最后一个值

    echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'

    f3

    f5

    echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'

    f2

    f4

    2)每行的列数

    echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print NF}'

    3

    3

    3)传递参数

    VAR=10000

    echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'

    5、运算和判断

    运算符

    awk 'BEGIN{a="b";print a++,++a;}'

    0 2

    awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'

    1

    注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0

    awk 'BEGIN{

        test=100;

        if(test>90){

            print "very good";

        } else if(test>60){

            print "good";

        } else{

            print "no pass";

        }

    }'

    very good

    awk 'BEGIN{

    for(k in ENVIRON){

    print k"="ENVIRON[k];

    }

    }'

    TERM=linuxG_BROKEN_FILENAMES=1SHLVL=1

    pwd=/root/text...

    logname=root

    HOME=/root

    SSH_CLIENT=192.168.1.21 53087 22

    6、高级输入

    cat a.js

    a

    b

    c

    d

    e

    awk 'NR%2==1{next}{print NR,$0;}' a.js

    2 b

    4 d

    cat a.js:

    web01[192.168.2.100]

    httpd ok

    tomcat ok

    sendmail ok

    web02[192.168.2.101]

    httpd ok

    postfix ok

    web03[192.168.2.102]

    mysqld ok

    httpd ok

    awk '/^web/{T=$0;next;}{print T":\t"$0;}' a.js

    web01[192.168.2.100]: httpd okweb01[192.168.2.100]: tomcat okweb01[192.168.2.100]: sendmail okweb02[192.168.2.101]: httpd okweb02[192.168.2.101]: postfix okweb03[192.168.2.102]: mysqld okweb03[192.168.2.102]: httpd ok

    执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素

    awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[1] }' test

    2018年

    awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'

    2 is

    3 a

    4 test

    1 it

    awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'0.841 22026.466 2.303 3

    支持的函数 字符串函数 时间函数

    相关文章

      网友评论

          本文标题:linux三剑客---awk

          本文链接:https://www.haomeiwen.com/subject/cnwelftx.html