AWK简介及使用实例(3)

同时使用'BEGIN END

BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
END:让用户在最后一条输入记录被读取之后发生的动作。

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
我这里就是在BEGIN: END:时,显示点字符,BEGIN/END可以只使用一个
[Oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' 'BEGIN {print "header-a#@#bb ospid"} {print $4"#@#"$5"\t"$9} END {print "Hello everone,my name is leifeng!"}'
header-a#@#bb ospid
pid#@#9 22862
pid#@#10 22866
pid#@#11 22870
pid#@#12 22874
pid#@#13 22878
pid#@#14 22882
Hello everone,my name is leifeng!
##################################################################################################

过滤显示需要的行:

首先使用'/MMAN/'过滤出包含MMAN的行,再传入另一个AWK进行运行,\n换行,\t相当于TAB
[oracle@bys3 ~]$ cat awktest.log |awk -F '[,= :]' '/MMAN/' |awk -F'[,= :]' '{print $9"\n"$1"\t"$0}'
22862
MMAN MMAN started with pid=9, OS id=22862
可以简化为:
[oracle@bys3 ~]$ cat awktest.log |awk -F '[,= :]' '/MMAN/{print $9"\n"$1"\t"$0}' --显示行中有MMAN
22862
MMAN MMAN started with pid=9, OS id=22862
显示LGWR开头的行到CKPT开头的行--如果CKPT开头的行后还有LGWR开头的行,则继续显示到下一个CKPT开头的行,如果不存在下一个CKPT开头的行,则显示到文件结尾
[oracle@bys3 ~]$ cat awktest.log |awk '/^LGWR/,/^CKPT/'
LGWR started with pid=11, OS id=22870
CKPT started with pid=12, OS id=22874
[oracle@bys3 ~]$ cat awktest.log |awk '/^LGWR/,/^CKPq/' --没有CKPq开头的行,一直显示到文件结尾
LGWR started with pid=11, OS id=22870
CKPT started with pid=12, OS id=22874
SMON:started with pid=13, OS id=22878
RECO:started with pid=14, OS id=22882
##################################################################################################

比较运算:可以做大于等于小与及加减除除运算

[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '{print $5}'
9
10
11
12
13
14
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5>12 {print $5}'
13
14
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5==10 {print $5 "#\t#" $0}'
10# #DBW0 started with pid=10, OS id=22866
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5<10 {print $5 "\t" $0}'
9 MMAN started with pid=9, OS id=22862
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5<10 {print$5*9 "\t" $0}' ---$5*9 显示为9*9 --81
81 MMAN started with pid=9, OS id=22862
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5<10 {print $5/9 "\t" $0}' ---$5/9 9/9 --1
1 MMAN started with pid=9, OS id=22862
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5<10 {print $5 "\t" $9}'
9 22862
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5*$9<220000 {print $5*$9 "###" $5 "\t" $9}' --$5*$9<220000 显示$5*$9小于22W的行,截取此行的$5 $9
205758###9 22862
##################################################################################################

使用正则表达式部分匹配字符示例:

查找开头是MM的行
[oracle@bys3 ~]$ cat awktest.log |awk '/^MM/'
MMAN started with pid=9, OS id=22862
查找开头是MM或D或L的行
[oracle@bys3 ~]$ cat awktest.log |awk '/^(MM|D|L)/'
MMAN started with pid=9, OS id=22862
DBW0 started with pid=10, OS id=22866
LGWR started with pid=11, OS id=22870
查找开关是字母M D L的行
[oracle@bys3 ~]$ cat awktest.log |awk '/^[MDL]/'
MMAN started with pid=9, OS id=22862
DBW0 started with pid=10, OS id=22866
LGWR started with pid=11, OS id=22870
查找指定域中后两位是数字,且数字分别是0-9 和0-2的 ~在这表示从结尾算
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5 ~/[0-9][0-2]$/{print $5}'
10
11
12
[oracle@bys3 ~]$ cat awktest.log |awk -F'[,= :]' '$5 ~/[3-4]$/{print $5}' --查找结尾字母是3-4的
13
14

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/18937.html