22、awk编程

简介: 1、BEGIN模块,通常用来改变内建变量的值,如 OFS,RS和FS等,以及打印标题。如: awk 'BEGIN{FS=" ";OFS="\t";ORS="\n"}{print $1,$2,$3}' file //输入域分隔符为空格,输出域分隔符为tab,记录分隔符为\n。

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

目录
相关文章
|
Linux Perl Java
5分钟入门AWK
AWK是Linux上卓越的文本处理工具,它具有非常简单的语法结构,拥有强大的文本处理能力。AWK 是一种解释执行的编程语言,AWK 的名称是由它们设计者的名字缩写而来 —— Afred Aho, Peter Weinberger 与 Brian Kernighan。
1930 0
|
Shell 网络安全 Perl
|
Web App开发 人工智能 Shell
|
Web App开发 Perl