luoxiaohui_java 发表于 2013-1-31 00:52:17

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

 
AWK 介绍:一个报文格式化,从文本文件中抽取数据包的工具。
思维: 基于模式动作形式,在动作前指定特定的模式,使动作在记录满足模式时才执行。
 
基本概念:
1、模式和动作:
模式:即触发动作的条件,模式部分决定动作何时触发及触发事件。
可以是:a 条件语句 if($4=="Green")
                 b 复合语句  and (&&)、 or(||)、! 
                 c 正则表达式   awk '$0 ~/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~/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!~/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 ~/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$
 
页: [1]
查看完整版本: AWK工具使用学习笔记(一)