简明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编程。



本文转自 PowerMichael 51CTO博客,原文链接:http://blog.51cto.com/huwho/1927930,如需转载请自行联系原作者

相关文章
|
前端开发 应用服务中间件 API
|
Java 编译器 测试技术
技术分享:为什么 IDEA 建议去掉 StringBuilder,使用 “+” 拼接字符串?
【8月更文挑战第13天】在Java开发过程中,字符串拼接是一个常见的操作。传统上,开发者在处理大量字符串拼接时,往往倾向于使用StringBuilder或StringBuffer类,因为它们比直接使用“+”操作符进行字符串拼接在性能上更优。然而,近年来,随着Java编译器的不断优化,以及开发工具IDEA(IntelliJ IDEA)的建议,我们可能会看到一种趋势:在某些情况下,IDEA建议直接使用“+”来拼接字符串,而不是使用StringBuilder。这一建议背后,隐藏着哪些技术原因和考量呢?
295 5
|
安全 Linux 芯片
传统的GPIO接口 【ChatGPT】
传统的GPIO接口 【ChatGPT】
|
存储 Web App开发 弹性计算
使用ECS和OSS搭建个人网盘
本场景将提供一台配置了Centos 7.7版本的ECS实例(云服务器)和对象存储OSS实例。通过本教程的操作,您可以基于ECS和OSS快速搭建一个个人网盘。
使用ECS和OSS搭建个人网盘
|
机器学习/深度学习 计算机视觉 Python
深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数(3)
深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数
|
存储 Dragonfly 缓存
Dragonfly 基于 P2P 的文件和镜像分发系统
业界软件生态在优化 HTTPS 的性能上也做了诸多探索,传统的软件优化方案在软件层面的优化无法满足流量日益增长的速度,CPU 硬件加速成为业界一个通用的解决方案。
Dragonfly 基于 P2P 的文件和镜像分发系统
|
缓存 NoSQL 数据库
分布式锁的实现逻辑及底层原理你了解多少
分布式锁是一种用于在分布式系统中实现互斥访问的机制,它能够确保在多个节点同时访问共享资源时,只有一个节点能够获得对资源的独占访问权。在本文中,将详细介绍分布式锁的实现逻辑和底层原理。
352 0
|
算法 API
期货交易跟单软件的API对接开发部署规则指南
期货交易跟单软件的API对接开发部署规则指南
玩转UDP用户原语,这篇文章就够了【Verilog高级教程】
玩转UDP用户原语,这篇文章就够了【Verilog高级教程】
玩转UDP用户原语,这篇文章就够了【Verilog高级教程】
|
敏捷开发 SQL 前端开发
PRD的编写要点详解
PRD的编写要点详解
868 0