awk简介
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )。
AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能(更多详细资料可以查看weki的词条)。
awk一般使用方法
|
|
上面是一个总体的格式,操作可以写的很复杂。
pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。大括号{}
不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用\
括起来。
filenames是待处理的文件。
执行awk命令
运行awk命令大致有以下三种方法:
1. 命令行方式:
|
|
[-F field-separator]域分隔符是可选项,表示以field-separator为分隔符将域分开。
在awk命令中,读文件时以\n
分隔符将文件按行读入,对于读入的每一行,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2. shell脚本方式:
将要执行的awk命令写进一个shell脚本,并使shell脚本可执行,然后awk命令解释器作为脚本的首行,相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
通过运行脚本即可运行其中的awk命令。
3. 将awk命令插入一个单独文件,然后调用:
|
|
其中,-f选项加载awk-script-file中的awk脚本。
几个简单的例子
下文中,我们主要以命令行的方式使用awk命令。
awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是”空白键
“ 或 “[tab]键
“。
ex1
Linux下,显示/etc/passwd
账户的第一列数据,即账户名。
|
|
或
|
|
显示结果大致如下:
|
|
这种是awk+action的示例,每行都会执行action{print $1}。
-F指定域分隔符为’:’。
ex2
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
|
|
显示结果:
|
|
ex3
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加”blue,/bin/nosh”。
|
|
显示结果:
|
|
awk工作流程是这样的:先执行BEGING
,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END
操作。
ex4
搜索/etc/passwd有root关键字的所有行。
|
|
显示结果:
|
|
这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
搜索支持正则,例如找root开头的: awk -F: ‘/^root/‘ /etc/passwd
awk内置变量
awk有许多内置变量用来设置环境信息,它们可以被改变,以下是一些常用的变量:
|
|
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
|
|
显示结果:
|
|
使用printf替代print,可以让代码更加简洁,易读。
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
|
|
显示结果同上。
awk编程
自定义变量和赋值
除了awk的内置变量,awk还可以自定义变量。
统计用户名中含sys
字段的账户总数
|
|
显示结果:
|
|
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;
号隔开。
统计某个文件夹下的文件占用的字节数,以MB为单位
|
|
显示结果:
|
|
注: 该统计不包括文件夹的子目录。
条件语句
awk中的条件语句是从C语言中借鉴来的,见如下声明方式:
|
|
统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹目录):
|
|
显示结果:
|
|
循环语句
awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
对于每行数据,依次输出它的前4列数据。
|
|
显示结果:
|
|
数组
因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等
显示/etc/passwd的账户(for循环遍历数组)
|
|
显示结果:
|
|
更多关于awk编程的内容,可以参考官方Guide。