awk简介
awk是一种使用方便且表现力很强的编程语言,它的名字来源于他的三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的姓,有趣的是Alfred和Brian刚好是蝙蝠侠和他的管家的名字。
它可以应用在多种不同的计算与数据处理任务中。由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(常见的是空格)隔开,我们可以将这个文件看成是由很多列的文本组成,这样的文件最适合用awk进行处理,其实awk在工作中很多时候被用来处理log文件,进行一些统计工作等。
命令结构
awk [options] ‘pattern{action}’ file
options是可选项,pattern是模式,action是动作,这是awk命令的基本构成,后面会说。
- awk的执行过程是扫描文件的每一行,如果有和模式匹配的,就执行后面的一系列动作。
- 动作的花括号‘{}’并不是一定要写的,用于和pattern进行分组
- 默认情况下,回车换行默认是一行的结束,$表示第几列,举个例子:
awk '{print $3}' 就是输出第三列,$0表示整行输出
常见options选项
- -F:指定字段分隔符,默认是空格
- -v: 初始化绑定变量
- -f :从文件读取awk命令,这种适合命令较长的情况
pattern模式
常用的是正则表达式,用斜杠隔开,后面有实例,这里介绍两种特殊的pattern。
- BEGIN : 处理开始前执行的操作,可以用来初始化变量等
- END: 处理完成后执行的操作
这两个语句只会执行一次
action动作
awk ‘{print 12}’ 表示连接在一起输出。
awk ‘{print 1,2}’ 表示用分隔符隔开输出。
内置变量
变量名 | 作用 |
---|---|
$n | 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段 |
$0 | 这个包含执行过程中当前行的文本内容。 |
FILENAME | 当前输入文件的名称 |
NR | 表示记录数,在执行过程中对应于当前的行号 |
FNR | 同NR:,但相对于当前文件 |
FS | 字段分隔符(默认是任何空格) |
NF | 示字段数,在执行过程中对应于当前的字段数。print $NF-行中最后一个字段 |
OFS | 输出字段分隔符(默认值是一个空格) |
ORS | 输出记录分隔符(默认值是一个换行符) |
RS | 记录分隔符(默认是一个换行符) |
操作实例
- 新建文件demo.txt,可以看到里面有四行数据,每一行有三列
- 开始操作
- 输出第二列
awk ‘{print $2}’ demo.txt
- 输出第一列和第三列
awk ‘{print $1,$3}’ demo.txt
- 输出第二列中包含字符“zhang”的行
awk ‘$2~/^zhang/{print;}’ demo.text
- 输出第二列不包含“yong”的行
awk ‘$2!~/^yong/{print;}’ demo.text
- 输出第二列不包含字符“yong”并且第三列大于70的列
awk ‘$2!~/^yong/ && $3>70{print;}’ demo.text
- 输出第二列不包含字符“yong”并且第三列大于70的列,并且处理开始前和处理完成后输出信息
awk ‘BEGIN{print “start”}$2!~/^yong/ && $3>70{print;}END{print “end”}’ demo.text
- 输出第一行
awk ‘NR == 1{print;}’ demo.text
- 输出最后一行
awk ‘END{print;}’ demo.text
- 计算第三列的和
awk ‘BEGIN{sum}{sum+=$3}END{print sum}’ demo.text
- 计算第三列的和并打印文件名
awk ‘BEGIN{sum}{sum+=$3}END{print sum,FILENAME}’ demo.text
- 打印第一行的字段个数
awk ‘NR == 1{print “第一行有”+NF+“个字段”}’ demo.text
- 打印每一行最后一个字段
awk ‘{print $NF}’ demo.text
- 新建文件demo1.txt,以“:”作为分隔符
- 指定分隔符为 :,并且分别打印第一列,第二列和第三列
第一种 ,-F选项指定
awk -F “:” ‘{print $1,$2,$3}’ demo1.txt
第二种,BEGIN语句内赋值FS内置变量,FS理解为filed spilt即可
awk ‘BEGIN{FS=":"}{print $1,$2,$3}’ demo1.txt
第三种,-v选项初始化内置变量FS
awk -v FS=":" ‘{print $1,$2,$3}’ demo1.txt
- 新建文件demo2.txt,我们看到只有一行
- 指定行记录换行符为#,并打印,需要注意的是#左右两边的空格不会去掉
awk ‘BEGIN{RS="#"}{print;}’ demo2.txt
- 指定行记录换行符为#,字段分隔符为:,并打印
awk ‘BEGIN{RS="#";FS=":"}{print $1,$2,$3}’ demo2.txt
- 指定行记录换行符为#,字段分隔符为:,输出时指定字段之间分隔符为+++(默认是空格),并打印
awk ‘BEGIN{RS="#";FS=":";OFS="+++"}{print $1,$2,$3}’ demo2.txt
- 指定行记录换行符为#,字段分隔符为:,输出时指定字段之间分隔符为+++(默认是空格),行记录分隔符为 ***(默认是换行符)
awk ‘BEGIN{RS="#";FS=":";OFS="+++";ORS="***"}{print $1,$2,$3}’ demo2.txt
- 通过文件导入awk命令,并且输出表格(增加表头)
awk -f awk_file demo.text
文件内容
输出效果:
写在最后
以上列举了一些常见的用法,awk我们一般是配合其他命令进行处理。除此之外,awk还有很多高级特性,有待各位读者研究。