简明awk实战演练

简明awk实战演练

1  awk是什么?

  AWK is a programming language designed for text processing and typically used as a data 
extraction and reporting tool. It is a standard feature of most Unix-like operating systems.
                                                                       from AWK - Wikipedia
  awk是一门编程语言,主要大量应用类unix系统中。它可以对文本以及标准输入的内容进行处理,处理完后可以
通过一定的格式输出。不同于grep,awk不仅仅可以行处理,也可以列处理;不仅仅支持程序语句,也支持数组。
awk功能非常强大,如果你想把shell编程玩的非常好的话,awk是你必须要掌握的一门编程语言。

wKiom1khb_HTC6B0AAE9tJ2414Y125.png   

     2 awk的工作原理


  工作流程:[ BEGIN{actions} ]-->输入数据流-->[ pattern'{actions}' ]-->[ END{actions}] 
   注:[ ]表示[]内的内容是可选的。
   awk的执行步骤
第一步:执行BEGIN{actions}语句块中的语句
第二步:awk从文件或者标准输入中读取一行,然后执行pattern{actions}语句块。它逐行扫描文件,先
读取行,再执行语句块,一直循环这个过程,直到所有的行被读取完成。
第三步:输入流被读读取完成后,执行END{actions}语句块

[ BEGIN{actions} ],见名知意,输入流数据开始之前要执行的语句块。此语句块是可选的。在文本未读
取之前执行的操作,你可以在这个语句块定义变量的初始值,打印一些信息等等。

END{actions},见名知意,输入流数据结束之后执行的语句块。它也是一个可选项。一般在这里可以放置
分析结果的汇总信息。

[ pattern'{actions}',见名知意,对输入流数据执行模式匹配并且语句块操作。你可以把这两者合并理
解为程序,即对输入流数据进行处理程序。它也是一个可选项。这部分是awk语句中核心的内容,默认是执行打印操
作(打印行所有的内容)。

 awk使用的基本格式:
   awk [options] [BEGIN{actions}] [ pattern'{actions}' ] [ END{actions} ] file
   可以看出awk由四大部分 option选项、BEGIN语句块、模式匹配的语句块、END语句块。需要注意的是 
[ pattern'{actions}'中的语句块,通常被单引号括起来。

 awk支持的功能:
   1.支持自定义变量以及包含非常强大的内置变量
       可以使用选项-v自定义变量,也可以在三大语句块中定义变量,不过awk其内置的变量相当强大,可以帮助
awk实现字段分隔(FS),字段数量的统计(NF),行号标记(NR),字段内容处理($0,$1,$2...)。$0表示所有字段
的内容,$1表示第一个字段的内容,$2表示第二个字段的内容。另外FS英文field of separator 的意思,字段分隔
符的意思,而NF则为number of field是字段数量的意思,统计的是每行字段数的个数,NR则为number of record,
是行数的意思。大家对于内置变量没必要死记硬背,用到的时候查询官方文档即可。
   2.支持打印功能
通过print或者printf可以将输入流数据打印。通过我们用它打印我们需要的字段的信息,而不是整行的信
息。如果你想美观的输出信息,可以使用printf,printf为格式化输出命令,支持很多的格式符,格式符基本也与c
语言中的格式符相同。
   3.支持各种操作符
算术操作符。即加减乘除等符号。+ - * /
赋值操作符。即= += -= *= /= ++ --等等
比较操作符。即== >= <= !=等等
   4.支持模式匹配
       这个相当重要。我们可以自己决定匹配的模式,从而打印出我们认为重要的信息。
4.1支持正则表达式的模式匹配:/(此处正则表达式)/
4.2支持关系表达式:即结果为真,就处理;否则,就不处理。
4.3支持行范围匹配:/part1/,/part2/ part1,part2为你自定义的行匹配的模式
4.4支持模式匹配符~。表示左边的内容是否被右边所匹配。
   5.支持逻辑操作符。即&& || ! 与或非。
   6.支持BEGIN/END模式。可以在输入流数据开始前或结束后执行操作。
   7.支持编程语句(if,while,for,switch,break,continue,next)
       这也是awk真正强大的地方,也是它可以被称为一门独立的编程语言的基础。我们可以在语句块,编写自己
需要的程序,去筛选我们需要的信息。
   8.支持数组,函数
       和一般的编程语言一样,也支持数组,函数。数组在awk中应用相当强大。


3 awk实战演练(由易到难)


  3.1 演示知识点:awk支持管道标准输入,自定义变量,打印功能
   :注意:awk中引用自定义变量不需要加$符号
   [root@big ~]#echo | awk '{var1="v1";var2="v2";var3="v3"} {print var1,var2,var3}'
   v1 v2 v3

 3.2 演示知识点:内置变量$1,$2...,打印字段内容
   [root@big ~]#cat file
   one two three
   one two three
   one two three
   one two three

   打印行中的第二以及第三个字段
   [root@big ~]#awk '{print $2,$3}' file
   two three
   two three
   two three

 3.3 演示知识点:支持BEGIN/END模式
   [root@big ~]#echo -e "line1\nlien2" | awk 'BEGIN{print "start"} {print} END{print "END"}'
   start
   line1
   lien2
   END

   在执行输入流数据处理前打印字符串,
   在执行输入流数据处理后打印字符串

 3.4 演示知识点:特殊内置变量:NR,NF,$1,$2...
   [root@big ~]#echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line no:"NR",
No of fileds:"NF, "$0="$0,"$1="$1,"$2="$2,"$3="$3}'
   Line no:1,No of fileds:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
   Line no:2,No of fileds:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
   Line no:3,No of fileds:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

   NR:行号
   NF:当前行的字段数
   $1:所在行的第一个字段的内容
   $2:所在行的第二个字段的内容
   $2:所在行的第三个字段的内容

 3.5 演示知识点:选项-F(自定义字段分隔符)
   awk -F: '{print $1,$3}' /etc/passwd
   [root@big 0520]#awk -F: '{print $1,$3}' /etc/passwd
   root 0
   bin 1
   daemon 2
   adm 3
   lp 4
   sync 5
   shutdown 6
   halt 7
   ...

 3.6 演示知识点:选项-V重复使用,内置变量FS,OFS
   [root@big 0520]#awk -v FS=":" -v OFS="###" '{print $1,$3}' /etc/passwd
   root###0
   bin###1
   daemon###2
   adm###3
   lp###4
   sync###5
   shutdown###6
   halt###7

   选项-V重复使用,可以定义多个变量
   FS:自定义输入字段分隔符
   OFS:自定义输出字段符
   此演示案例:将输入分隔符:换为###

 3.7 演示知识点:printf格式化输出
   awk -F: '{printf "username:%-10s UID:%d\n",$1,$3}' /etc/passwd
   [root@big 0520]# awk -F: '{printf "username:%-10s UID:%d\n",$1,$3}' /etc/passwd
   username:root       UID:0
   username:bin        UID:1
   username:daemon     UID:2
   username:adm        UID:3
   username:lp         UID:4
   username:sync       UID:5
   username:shutdown   UID:6
   username:halt       UID:7
   username:mail       UID:8
 3.8 演示知识点:综合应用,模式匹配,split函数,语句
   [root@big 0520]#netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in
count){print i,count[i]}}'
   10.0.0.1 1
   0.0.0.0 5


4 awk总结


  本文主要介绍awk的简介,awk的基本原理以及awk的大量实战演练。
 awk支持的功能非常多,非常复杂。我们需要通过大量的练习,才能够真正熟练操作awk编程。多多练习,必将玩转
awk编程。
  时间:2017/05/21 
 作者: Michael




来源:春哥技术博客,欢迎分享,转载请注明出处。(欢迎加春哥团队客服微信号:taike668)

本文地址:https://www.cgtblog.com/wljs/1970.html
上一篇:redis配置详解      下一篇:Linux文件的三个时间概念