awk使用

awk使用

awk是什么?

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk。

awk用法:

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

第一步:运行BEGIN{ commands }语句块中的语句。

第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。

第三步:当读至输入流末尾时。运行END{ commands }语句块。

BEGIN语句块在awk開始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。

END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END语句块中完毕,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。

这三个部分缺少任何一部分都可以。

内置变量:

  • $0 当前行记录(存放整行内容)
  • 1   1~ 1 n 当前行的第n列字段,字段由FS分割
  • FS 输入字段分隔符,默认是空格或Tab
  • NF 当前行记录中的字段个数,就是有多少列
  • NR 已经读出的行记录数(行数),从1开始,如果有多个文件话,这个值也是不断累加中。
  • FNR 当前行记录数(行数),与NR不同,这个值是各个文件自己的行号
  • RS 输入的记录分隔符, 默认为换行符
  • OFS 输出字段分隔符,默认也是空格
  • ORS 输出的记录分隔符,默认为换行符
  • FILENAME 当前输入文件的名字

例如:

[root@vm10-10-3-107 ~]# awk -F ':' '{printf("文件名:%s,行数:%d,列数:%d,内容:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
文件名:/etc/passwd,行数:1,列数:7,内容:root:x:0:0:root:/root:/bin/bash
文件名:/etc/passwd,行数:2,列数:7,内容:bin:x:1:1:bin:/bin:/sbin/nologin
文件名:/etc/passwd,行数:3,列数:7,内容:daemon:x:2:2:daemon:/sbin:/sbin/nologin
文件名:/etc/passwd,行数:4,列数:7,内容:adm:x:3:4:adm:/var/adm:/sbin/nologin
文件名:/etc/passwd,行数:5,列数:7,内容:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
文件名:/etc/passwd,行数:6,列数:7,内容:sync:x:5:0:sync:/sbin:/bin/sync
文件名:/etc/passwd,行数:7,列数:7,内容:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

自定义变量:

例如:统计当前文件夹下一txt为后缀的文件大小。

[root@vm10-10-3-107 ~]# ls -l
total 16
-rw-r--r-- 1 root root 20 Nov 20 15:27 test1.txt
-rw-r--r-- 1 root root 20 Nov 20 15:27 test2.txt
-rw-r--r-- 1 root root 20 Nov 20 15:02 test.txt
-rw-r--r-- 1 root root 20 Nov 20 15:28 test.txt.bac
[root@vm10-10-3-107 ~]# ls -l *.txt | awk '{sum+=$5} END {print sum}'
60

语句:

awk中的条件语句(if…else if…else)和循环语句(while、do…while、for、break、continue)与C语言类似。

数组:

awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key),值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

例如:统计重复出现次数。

[root@vm10-10-3-107 ~]# cat test.txt
a 00
b 01
c 00
d 02
e 03
f 03
g 01
h 00
[root@vm10-10-3-107 ~]# cat test.txt|awk '{sum[$NF]+=1} END {for(i in sum) print i,sum[i]}'
00 3
01 2
02 1
03 2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值