awk介绍

awk基础

awk基本语法如下,

awk [options] ‘program’ file

对于上述语法中的program来说,又可以细分成pattern和action,也就是说,awk的基本语法如下

awk [options] ‘Pattern{Action}’ file

从字面上理解 ,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文本输出啊,所以,这两个动作最常用。

我们先从最简单用法开始了解awk,我们先不使用[options] ,也不指定pattern,直接使用最简单的action,从而开始认识awk,示例如下

[root@test ~]# echo sss > test
[root@test ~]# awk '{print}' test
sss
[root@test ~]# 

我们只是使用awk执行了一个打印的动作,将test文件中的内容打印了出来。

好了,现在,我们来操作一下另一个类似的场景。

[root@test ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
devtmpfs                  1887080       0   1887080   0% /dev
tmpfs                     1898696       0   1898696   0% /dev/shm
tmpfs                     1898696   49876   1848820   3% /run
tmpfs                     1898696       0   1898696   0% /sys/fs/cgroup
/dev/mapper/centos-root  19355648 3145972  16209676  17% /
/dev/sda1                  505580  259256    246324  52% /boot
/dev/sdb1                92757672   57368  87965432   1% /mnt
tmpfs                      379740       0    379740   0% /run/user/0
[root@test ~]# df | awk '{print $5}'
Use%
0%
0%
3%
0%
17%
52%
1%
0%
[root@test ~]# 


上图中的示例没有使用到options和pattern,上图中的awk ‘{print 5表示将当前行按照分隔符分割后的第5列,不指定分隔符时,默认使用空格作为分隔符,细心的你一定发现了,上述信息用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分割符了,是不是比cut命令要简单很多,这样比较简单的例子,有利于我们开始了解awk。

awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以”换行符”为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到”回车换行”,就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。

NF表示当前行分割后的最后一列(NF均为内置变量)

注意,NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。

也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,7, 而(NF-1)。

我们也可以一次输出多列,使用逗号隔开要输出的多个列,如下,一次性输出第一列和第二列

[root@test ~]# cat test
asd asd1  123tw 
zxcsfa
asdzxcga asdqeqe zxcseq zxca
666 4555 333 222
[root@test ~]# awk '{print $1,$2}' test
asd asd1
zxcsfa 
asdzxcga asdqeqe
666 4555
[root@test ~]# 


但是要注意,1会被当做文本输出,示例如下

[root@test ~]# awk '{print "$1",$2}' test
$1 asd1
$1 
$1 asdqeqe
$1 4555


现在,我们来认识下一Pattern,也就是我们所说的模式

AWK 包含两种特殊的模式:BEGIN 和 END。

BEGIN 模式指定了处理文本之前需要执行的操作:

END 模式指定了处理完所有行之后所需要执行的操作:

什么意思呢?光说不练不容易理解,我们来看一些小例子,先从BEGIN模式开始,示例如下

[root@test ~]# awk 'BEGIN{print "aaa","bbb"}' test
aaa bbb


上述写法表示,在开始处理test文件中的文本之前,先执行打印动作,输出的内容为”aaa”,”bbb”.

也就是说,上述示例中,虽然指定了test文件作为输入源,但是在开始处理test文本之前,需要先执行BEGIN模式指定的”打印”操作

既然还没有开始逐行处理test文件中的文本,那么是不是根本就不需要指定test文件呢,我们来试试。

[root@test ~]# awk 'BEGIN{print "aaa","bbb"}'
aaa bbb

经过实验发现,还真是,我们并没有给定任何输入来源,awk就直接输出信息了,因为,BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的”打印”动作,打印完成后,发现并没有文本可以处理,于是就只完成了”打印 aaa bbb”的操作。

这个时候,如果我们想要awk先执行BEGIN模式指定的动作,再根据执我们自定义的动作去操作文本,该怎么办呢?示例如下

[root@test ~]# awk 'BEGIN{print "aaa","bbb"}{print $1,$2}' test
aaa bbb
asd asd1
zxcsfa 
asdzxcga asdqeqe
666 4555

看完上述示例,似乎更加容易理解BEGIN模式是什么意思了,BEGIN模式的作用就是,在开始逐行处理文本之前,先执行BEGIN模式所指定的动作。以此类推,END模式的作用就一目了然了,举例如下。

[root@test ~]# awk 'END{print "aaa","bbb"}{print $1,$2}' test
asd asd1
zxcsfa 
asdzxcga asdqeqe
666 4555
aaa bbb

上述示例中返回的结果有没有很像一张”报表”,有”表头” 、”表内容”、 “表尾”,awk对文本的格式化能力你体会到了吗?

大家快来一起学习 文本处理工具 awk,缺乏机器练手的小伙伴可以去 cnaaa 看一看!

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务