• 22、awk编程


    1、BEGIN模块通常用来改变内建变量的值,如 OFS,RSFS等,以及打印标题。如:

    awk 'BEGIN{FS=" ";OFS="\t";ORS="\n"}{print $1,$2,$3}' file //输入域分隔符为空格,输出域分隔符为tab,记录分隔符为\n

    $awk 'BEGIN{print "TITLE TEST"}

    2、END在整个输入文件处理完成后被执行。如

    $awk 'END{print "The number of records is" NR}' test  //打印被处理的记录数

    3、重定向

    awk '$1==100{print $1 > "out"}' test.cpp

    4、管道

    1)awk 'BEGIN{"date" | getline d; print d}' test.cpp //执行linuxdate命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。

    getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NRFNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1

    2)awk 'BEGIN{"date" | getline d;split(d,mon); print mon[2]}' //split函数把变量d转化成数组mon,然后打印数组mon的第二个元素

    3)awk 'BEGIN{while("ls"|getline)print}'

        循环使getlinels的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。

    4)awk 'BEGIN{printf "what is you name?"; getline name < "/dev/tty"}$1~name{print "Found " name on line ","NR"."}' file

    5)awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'

    6)可以在awk中打开一个管道,且同一时刻只能有一个管道存在。通过close()可关闭管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}awkprint语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。

    system函数可以在awk中执行linux的命令。

    awk 'BEGIN{system("clear")}'

        fflush函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓冲区,如果以空字符串为参数,如fflush(""),则刷新所有文件和管道的输出缓冲区。

    5awk '{i=1;while(i<=NF){print NF,$1;i++}}' file

        next语句从输入文件中读取一行,然后从头开始执行awk脚本

        exit语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错

    6数组

    1)用变量作为数组下标。如:$ awk '{name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' test

    输出数组中元素:

    {

    for (item in arrayname)

    {

    print arrayname[item]

    }

    }

        delete函数用于删除数组元素。如:$ awk '{line[x++]=$1} END{for(x in line) delete(line[x])}' test

    7、内建函数

    1)sub函数匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。只替换一次。

    sub (regular expression, substitution string):

    sub (regular expression, substitution string, target string)

    awk '{ sub(/test/, "mytest"); print }' testfile

    2)gsub替换所有。

    3)index函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。

    index(string, substring)

    awk '{print index("socket.h","ck")}' file

    4)length函数返回记录的字符数

    5)子字符串

    substr( string, starting position )

    substr( string, starting position, length of string )

    6)touppertolower函数可用于字符串大小间的转换,该功能只在gawk中有效

    7)split按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。格式如下:

    split( string, array, field separator )

    split( string, array )

    awk '{ split( "20:18:00", time, ":" ); print time[2] }'

    awk '{if (NF==6){split($5,a,"/");if (a[1]>=a[2])print $0}}' *

    8)时间函数systime

    9)数学函数sin[1]

    10)自定义函数

    function name ( parameter, parameter, … )

    {

    statements

    return expression     # the return statement and expression are optional

    }

    8、默认print $0

    9、变量不需要定义就可以直接使用,变量类型可以是数字或字符串。

    10、字符串一定要用双引号。

    1http://blog.microsuncn.com/?p=1232

    2http://blog.zol.com.cn/2418/article_2417320.html

    【3】 http://hi.baidu.com/xuehuo_0411/blog/item/11603600b4cd31cc277fb5bb.html

  • 相关阅读:
    JMM内存模型
    APUE习题8.7
    整型和字符数组之间的转换(略带进制的转化)
    数据结构学习——shell排序的C语言实现
    Unix环境高级编程学习笔记——fcntl
    Unix环境高级编程学习笔记——dup
    链表
    计算机数值表示
    整数位运算相关操作
    win和linux下控制台界面中停顿X秒的方式
  • 原文地址:https://www.cnblogs.com/mydomain/p/2172914.html
Copyright © 2020-2023  润新知