shell-awk

awk基本语法

awk也是一款比较强大的文本处理工具

awk是一种强大的文本处理工具,是Linux以及Unix环境中现有的功能最强大的数据处理引擎之一,awk具备一个完美的编程语言应具有的几乎所有的精美特性,是一种用于处理文本的编程语言工具

awk的用途

awk用于在文件中查找与模式匹配的行,并在这些行上执行指定的操作!
awk命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行,然后在任何与扩展正则表达式匹配的行上执行操作,如果找不到匹配内容,则继续处理下一行。
awk命令的模式搜索比grep命令更加常用。

记录和字段

awk把输入流看作一连串记录的集合,每条记录又进一步细分为字段。这里的记录和字段,和数据库中的记录和字段非常的类似。
记录是由记录分隔符RS隔开的一组数据,记录分隔符的缺省值是换行符,他使文件中的每一行成为一个单独的记录,在awk中,记录分隔符可以通过设置awk的内奸变量RS来更改

awk的程序指令模型

awk的两种形式语法格式:

awk [option] 'commands' filename
awk [option] -f awk-script-file filename

一个典型的awk程序指令是由模式(pattern)和大括号括起来的操作(action)组合而成的,具体格式如下:

pattern {action}

对于awk读取的每条记录,如果一个记录与指定模式(pattern)想匹配,或包含与该模式匹配的字段,那么执行相应的操作(action)。

具体事例看我另一篇文档,或者自行百度。

awk程序流程介绍

1、自动从输入读取一条记录
2、自动更新相关的内建变量的值,例如:NF,NR,$0等
3、依次执行程序中所有的pattern{action}指令
4、执行完所有的pattern{action}指令后,若从输入还可以读取到数据,则反复执行1-4步骤
  以上四个步骤的重复复执行,完全由awk来自动进行,无需使用者编写这个循环,使用者只需要根据业务需求设计pattern{action}即可

具体案例自行百度,这块接触的都是简单的操作,复杂的目前没时间学。

awk模式匹配

awk总的各种模式详解

下面为awk程序指令的模型,每个awk程序都是由一些下面的语句组成,从而完成特定的功能:
pattern{action}
awk通过pattern(模式)来控制是否处理当前记录,如果当前记录和pattern匹配,则执行action(操作),在awk中,有以下几种模式:
  1、正则表达式
  2、关系表达式
  3、组合的pattern
  4、pattern1,pattern2
  5、算数表达式
  6、BEGIN
  7、END

案例操作:首先新建一个文件avengers.txt,以实例的方式一一进行说明:

[root@localhost test]# vim avengers.txt
[root@localhost test]# cat avengers.txt 
hulk 85 92 78
captain 89 90 75
ironman 84 88 80 
widow 83 78 90
hawkeye 86 88 79
[root@localhost test]# 

这是一个简单的学生成绩表,共五个学生的成绩,每条记录包括:名字,然后是三门课的成绩

1.正则表达式,如果使用元字符{}前使用两个/ "//"里面使用元字符。

[root@localhost test]# awk '/9[0-9]/ {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
widow 83 78 90
[root@localhost test]# 

指令查询有一门成绩在[90-99]区间的学生的成绩信息,这里pattern的类型为正则表达式

[root@localhost test]# awk '$3 ~ /9[0-9]/ {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
[root@localhost test]# 

这条指令在上一条的基础上增加了限制,需要第二门课在【90-99】区间才可以与模式匹配,这里的~表示变量是否采用正则表达式。

2.关系表达式

[root@localhost test]# awk '$3 >= 90 {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
[root@localhost test]# 

这条指令的作用也是查询数学成绩在90分以上的学生成绩信息,不过比正则表达式中的范围要大(100页符合)

3.组合的pattern(模式)

[root@localhost test]# awk '$3 >= 90 && $3 < 100 {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
[root@localhost test]# 

布尔运算符 ||(或) &&(和) 以及!(不)将模式组合,组合后如果求值为真则模式匹配,否则不匹配。

4.pattern1,pattern2

[root@localhost test]# awk 'FNR == 2, FNR == 4 {print $0}' avengers.txt 
captain 89 90 75
ironman 84 88 80 
widow 83 78 90
[root@localhost test]# 

其实这个也可以归为组合的模式总共,只是这种模式比较特殊,所有单独列出。(逗号)隔开的两个pattern指定一个范围,对从匹配的第一个pattern的记录开始,到匹配第二个pattern结束的所有记录执行action。

5.算术表达式

[root@localhost test]# awk 'FNR == 2, FNR == 4 {print $0,$2+$3+$4}' avengers.txt 
captain 89 90 75 254
ironman 84 88 80  252
widow 83 78 90 251
[root@localhost test]# 

算数运算包括:+(加),-(减),*(乘),/(除),%(取模)。

6.BEGIN

BEGIN模式是awk的一种特殊的pattern,BEGIN模式指定的操作在读取任何输入之前执行,且只执行一次。使用BEGIN模式甚至不需要指定输入文件,一般把与数据文件内容无关以及只需执行一次的部分置于BEGIN模式为pattern的action中。

假如我们要讲学生成绩表打印出来,那总得加点表头什么的吧,就可以写在BEGIN中了。

[root@localhost test]# awk 'BEGIN {print "Print student score table"}'
Print student score table
[root@localhost test]# 

7.END

end模式也是awk中一种特殊的pattern,END模式指定的操作在读取所有的输入后执行。

[root@localhost test]# awk 'END {print "Work done "}' avengers.txt 
Work done 
[root@localhost test]# 

 

更多操作请自行百度。目前用到的不是特别多。。

原文地址:https://www.cnblogs.com/52-qq/p/9605104.html