读书人

AWK工具应用学习笔记(一)

发布时间: 2012-09-10 11:02:32 作者: rapoo

AWK工具使用学习笔记(一)

?

AWK 介绍:一个报文格式化,从文本文件中抽取数据包的工具。

思维: 基于模式动作形式,在动作前指定特定的模式,使动作在记录满足模式时才执行。

?

基本概念:

1、模式和动作:

模式:即触发动作的条件,模式部分决定动作何时触发及触发事件。

可以是:a 条件语句 if($4=="Green")

???????????????? b 复合语句? and (&&)、 or(||)、!?

???????????????? c 正则表达式?? awk '$0 ~/[Gg]reen/? {print? $0}'? grade.txt

动作:对数据进行的操作。 动作必须用{}括起来

2、域和记录:

域:awk将标准输入的每一行按照分隔符分成n个域,依次为$1,$2,$3,…,$n

要输出域采用print语句,输出所有域使用$0.

?

?

判断AWK语句错误的一些依据:

1)、确保整个awk命令用单引号括起来;

2)、确保命令内的所有引号成对出现;

3)、确保用花括号括起动作语句,用圆括号括起条件语句;

?

重点知识点:

1、AWK输出报头和报尾及格式化输出。

BEGIN? END? 采用print语句格式输出

例如:

awk 'BEGIN {print "Name??? Belt\n----------------------"} {print

?$1 "\t\t" $4} END {print "end-of-report"}' grade.txt

Name??? Belt

----------------------

M.Tansley?????? 05/99?? 48311?? Green?? 8?????? 40????? 44

J.Lulu????????? 06/99?? 48317?? green?? 9?????? 24????? 26

P.Bunny???????? 02/99?? 48????? Yellow? 12????? 35????? 28

J.Troll???????? 07/99?? 4842??? Brow-3? 12????? 26????? 26

L.Tansley?????? 05/99?? 4712??? Brow-3? 12????? 30????? 28

end-of-report

tom@svr:~/ssh$ ???

BEGIN: 设置计数和打印头

END:用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志

?

2、使用正则表达式? ~

1)打印第4个域值为Green和green的行

tom@svr:~/ssh$ awk '{if($4~/[Gg]reen/) print $0}' grade.txt

M.Tansley?????? 05/99?? 48311?? Green?? 8?????? 40????? 44

J.Lulu????????? 06/99?? 48317?? green?? 9?????? 24????? 26

tom@svr:~/ssh$ ?

2)打印第4个域值非Green和green的行 ?!~

tom@svr:~/ssh$ awk '{if($4!~/[Gg]reen/) print $0}' grade.txt

P.Bunny???????? 02/99?? 48????? Yellow? 12????? 35????? 28

J.Troll???????? 07/99?? 4842??? Brow-3? 12????? 26????? 26

L.Tansley?????? 05/99?? 4712??? Brow-3? 12????? 30????? 28

tom@svr:~/ssh$

3)匹配行中出现有特定字符的行,省去了if条件

tom@svr:~/ssh$ awk '$0 ~/[Gg]reen/ {print $0}' grade.txt

M.Tansley?????? 05/99?? 48311?? Green?? 8?????? 40????? 44

J.Lulu????????? 06/99?? 48317?? green?? 9?????? 24????? 26

tom@svr:~/ssh$

?

3、条件表达式

完全匹配某字符串? ==

tom@svr:~/ssh$ awk '{if($4=="Green") print $0}' grade.txt

M.Tansley?????? 05/99?? 48311?? Green?? 8?????? 40????? 44

tom@svr:~/ssh$

不可写成:

awk 'if($4=="Green") {print $0}' grade.txt

if条件是动作的一部分,必须与动作写在一个花括号内。

?

?

AWK内置变量:

NR:已读的记录数

NF:浏览记录的域个数

FILENAME: awk浏览的文件名 awk一次可以浏览多个文件

?

tom@svr:~/ssh$ awk '{if(NR>0 && $4~/(green|Green)/) print $0}' grade.txt

M.Tansley?????? 05/99?? 48311?? Green?? 8?????? 40????? 44

J.Lulu????????? 06/99?? 48317?? green?? 9?????? 24????? 26

tom@svr:~/ssh$

?

读书人网 >编程

热点推荐