Linux 三剑客之 awk(一):awk 简介与表达式实例

栏目: 服务器 · 发布时间: 5年前

内容简介:本文为「Linux三剑客之awk」系列文章(本系列共三篇文章)第一篇,主要介绍awk及正则表达式、比较表达式等。awk不仅仅是linux系统中的一个命令,而且是一种编程语言;它可以用来处理数据和生成报告(excel);处理的数据可以是一个或多个文件;可以是直接来自标准输入,也可以通过管道获取标准输入;awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。

Linux 三剑客之 awk(一):awk 简介与表达式实例

本文为「Linux三剑客之awk」系列文章(本系列共三篇文章)第一篇,主要介绍awk及正则表达式、比较表达式等。

  • 一种名字怪异的语言

  • 模式扫描和处理,处理数据和生成报告。

awk不仅仅是 linux 系统中的一个命令,而且是一种编程语言;它可以用来处理数据和生成报告(excel);处理的数据可以是一个或多个文件;可以是直接来自标准输入,也可以通过管道获取标准输入;awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。

sed处理stream editor文本流,水流。

一、awk环境简介

本文涉及的awk为gawk,即GNU版本的awk。

[root@creditease awk]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@creditease awk]# uname -r
3.10.0-862.el7.x86_64
[root@creditease awk]# ll `which awk`
lrwxrwxrwx. 1 root root 4 Nov  7 14:47 /usr/bin/awk -> gawk 
[root@creditease awk]# awk --version
GNU Awk 4.0.2

二、awk的格式

awk指令是由模式、动作,或者模式和动作的组合组成

Linux 三剑客之 awk(一):awk 简介与表达式实例

Linux 三剑客之 awk(一):awk 简介与表达式实例

  • 模式即pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把它理解为一个条件。

  • 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。如下awk使用格式。

三、记录和域

名称 含义
record 记录,行
filed 域,区域,字段,列

1)NF(number of field)表示一行中的区域(列)数量,$NF取最后一个区域。

2)$符号表示取某个列(区域),$1,$2,$NF

3)NR (number of record) 行号,awk对每一行的记录号都有一个内置变量NR来保存,每处理完一条记录NR的值就会自动+1

4)FS(-F)field separator 列分隔符,以什么把行分隔成多列

3.1 指定分隔符

[root@creditease awk]# awk -F "#" '{print $NF}' awk.txt 
GKL$123
GKL$213
GKL$321
[root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt 
123
213
321

3.2 条件动作基本的条件和动作

[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt
ABC

3.3 只有条件

[root@creditease awk]# awk -F "#" 'NR==1' awk.txt
ABC#DEF#GHI#GKL$123

默认会有动作{print $0}

3.4 只有动作

[root@creditease awk]# awk -F "#" '{print $1}' awk.txt
ABC
BAC
CAB

默认处理所有行

3.5 多个模式和动作

[root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt 
GKL$123
GKL$321

3.6 对$0的认识

awk中$0表示整行

[root@creditease awk]# awk '{print $0}' awk_space.txt
ABC DEF GHI GKL$123
BAC DEF GHI GKL$213
CBA DEF GHI GKL$321

3.7 FNR

FNR与NR类似,不过多文件记录不递增,每个文件都从1开始(后边处理多文件会讲到)

[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt 
1
2
3
4
5
6
[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt 
1
2
3
1
2
3

四、正则表达式与操作符

awk同sed一样也可以通过模式匹配来对输入的文本进行匹配处理。 awk也支持大量的正则表达式模式,大部分与sed支持的元字符类似,而且正则表达式是玩转三剑客的必备工具。

awk支持的正则表达式元字符

元字符 功能 示例 解释
^ 字符串开头 /^creditease 匹配所有以creditease开头的字符串
$ 字符串的结尾 /creditease$/ 匹配所有以creditease结尾的字符串
. 匹配任意单个字符包(括回车符) /c..1/ 匹配字母c,然后两个任意字符,再以1结尾的行,比如:ckkl
* 重复0个或多个前一个字符 /a*cool/ 匹配0个或多个a之后紧跟着cool的行,比如cool,aaacool
+ 重复前一个字符一次或一次以上 /a+b/ 匹配一个或多个a加b的行。
? 匹配0个或一个前导字符 /a?b/ 匹配b或ab的行
[] 匹配指定字符组内的任一个字符 /^[abc]/ 匹配以字母a或b或c开头的行。
[^] 匹配不在指定字符组内的任一字符 /^[^abc]/ 匹配不以字母a或b或c开头的行。
() 子表达式组合 /(cool)+/ 表示一个或cool组合,当有一些字符需要组合时,使用括号括起来。
或者的意思 /(cool)

awk默认不支持的元字符,和需要添加参数才能支持的元字符

元字符 功能 示例 解释
x{m} x重复m次 /cool{5}/ 需要注意一点的是,cool加括号或不加括号的区别,x可以使字符串也可以只是一个字符,所以/cool{5}/表示匹配coo再加上5个l,即coolllll。/(cool){2,}/表示匹配coolcool,coolcoolcool等。
x{m,} x重复至少m次 /(cool){2,}/ 同上
x{m,n} x重复至少m次,但不超过n次,需要指定参数:--posix或者--re-interval。没有该参数不能使用这种模式 /(cool){5,6}/ 同上

正则表达式的运用,默认是在行内查找匹配的字符串,若有匹配则执行action操作,但是有时候仅需要固定的列表匹配指定的正则表达式。

比如:

我想取/etc/passwd文件中第五列($5)这一列查找匹配mail字符串的行,这样就需要用另外两个匹配操作符。并且awk里面只有这两个操作符来匹配正则表达式的。

正则匹配操作符
~ 用于对记录或区域的表达式进行匹配。
!~ 用于表达与~相反的意思。

4.1 正则实例

1)显示awk.txt中GHI列

[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '{print $3}' awk.txt 
GHI
GHI
GHI
[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt 
GHI
GHI
GHI

2)显示包含321的行

[root@creditease awk]# awk '/321/{print $0}' awk.txt 
CBA#DEF#GHI#GKL$321

3)以#为分隔符,显示第一列以B开头或最后一列以1结尾的行

[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

4)以#为分隔符,显示第一列以B或C开头的行

[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

五、比较表达式

awk是一种编程语言,能够进行更为复杂的判断,当条件为真时,awk就执行相关的action,主要是在针对某一区域做出相关的判断,比如打印成绩在80分以上的,这样就必须对这一个区域作比较判断.

下表列出了awk可以使用的关系运算符,可以用来比较数字字符串,还有正则表达式,当表达式为真的时候,表达式结果为1,否则为0,只有表达式为真,awk才执行相关的action。

awk支持的关系运算符

运算符 含义 示例
< 小于 x>y
<= 小于或等于。 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大于或等于 x>=y
> 大于 x<y

5.1 比较表达式实例

显示awk.txt的第2 ,3 行

NR //,//

[root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk 'NR>=1{print $0}' awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

:star:️:star:️:star:️欢迎加入“ 宜信技术交流群 ”。进群方式:请加小助手微信( 微信号:creditease_tech )。

◆  ◆  ◆  ◆ 

如需转载请与小助手 (微信号: creditease_tech)联系。 发现文章有错误、对内容有疑问,都可以通过关注宜信技术学院微信公众号( CE_TECH ),在后台留言给我们。我们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注我们吧!

Linux 三剑客之 awk(一):awk 简介与表达式实例

:arrow_double_down: 点击“阅读原文”查看更多技术干货

Linux 三剑客之 awk(一):awk 简介与表达式实例


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Boolean Reasoning

Boolean Reasoning

Brown, Frank Markham / 2003-4 / $ 19.15

A systematic treatment of Boolean reasoning, this concise, newly revised edition combines the works of early logicians with recent investigations, including previously unpublished research results. Th......一起来看看 《Boolean Reasoning》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换