AWK(三位创造者Aho、Weinberger和Kernighan统称)是一种优良的文本处理工具。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。(nawk是awk的新版本,gawk 是 AWK 的 GNU 版本)
一,awk 命令格式
awk ‘pattern { action }’ 其中 pattern 表示 awk 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
二,运行awk 程序
a,如果程序比较短,我们可以用:
awk options ‘program’input-file1 input-file2…
program 包含一系列的、patterns和actions
b,如果程序比较长,我们可以用:
awk –f awk-script-file input-file1 input-file2…
-f awk-script-file:允许awk调用并执行awk-script –file中指明的awk脚本。awk-script-file是一个文本文件,它必须符合awk的语法。
三,读取输入文件
在典型的awk命令中,所有从标准输入或从你在awk命令行指定的文件中输入都会被读取,如果你指定输入文件,awk按顺序一个记录即一行接一行地读取它们,并且当前被读取的文件可以在awk内置变量 FILENAME中被发现。输入是通过awk中的规则每次一行的被处理,每一行又可被分割成字段。如果设置了-F选项,则每次读取一行,并用指定的分隔符指定域,但如果未设置-F选项,则假定以空格为域分隔符。
四,输入如何被分割成记录
awk把输入按照规则划分成记录和字段
FNR:当前文件中已经被读取行的行号,当读取到新行时自动被重设为0
NR:到目前为止读取所有文件的总行数,从零开始并从不归零。
行被Record separator 分开,即:RS.默认情况下行分隔符是换行符,我们也可以用“RS”内置变量自定义行换行符。
五,字段fileds
当awk读取输入行时,行被自动分割成字段。默认情况下,字段被whitespace(空格,Tab,换行符),“$”被用来指定一个字段,$1,$2,$3…表示一行中的第一个字段,第二个字段,第三个字段…
$0表示整行。
NF也是一个内置变量,用来表示当前行中字段号。awk在每读取一行时会自动改变NF的值;无论有多少字段,最后一个字段可以用“$NF”表示。
六,awk参数
七,模式 patterns
awk支持多种类型的匹配模式去过滤数据记录,其中BEGIN和END就是两个特殊的模式:BEGIN语句使用在数据流数据被读取之前的执行状态,END语句使用在数据流数据被读取之后的执行状态
模式元素:gegexp,expressin,range,BEGIN/END,empty
a,规则表达式
/pattern/ 即包含pattern的整行“$0 ~/pattern”
b,匹配符
~ 在记录或字段中匹配一个表达式
!~在记录或字段中不匹配一个表达式
c,表达式
d,空模式
空模式可以匹配任意的输入
e,BEBIN/END
BEBIN/END可以处理一些开始和收尾工作,BEBIN/END必须有动作,并且没有默认的动作,因为当它们运行时没有当前的记录。BEBIN规则仅仅运行一次,并且是在第一个输入被读取之前执行;END规则也仅仅运行一次,并且是在所有输入被读取之后执行。
八,动作 actions
{action} 动作要被大括号括起来并且被分号分开。动作可以是简单的表达式也可以是复杂的一组表达式。
打印输出 print 表达式可以用简单的标准格式打印输出,后可跟以逗号分开的多个选项 print item1,item2…
要输出的选项可以包括字符串,数字,当前行的字段,变量,awk表达式,数字的值要被转变成字符串,接着再输出,单个的“pirnt”就等于“print $0”,如果要打印空白行可以用:’print “”’.
1、 输出分割符 print表达式包括一系列被逗号分开的选项,在输出中选项一般以单个空格分开,当然我们也可以用一个内置变量OFS来作为分割符。
从一个完整的print表达式中输出的内容叫做out record,每个输出行被输出行分隔符(ORS)分开,ORS的初始值为“/n”
自定义输出分隔符 为了改变输出字段和记录如何被分割,我们可以设定内置变量OFS和ORS的值,通常可以在BEGIN规则里定义这些值,也可以在命令行里放在输入文件名字的前面以任务来做,或用“-v command-line ”参数
awk‘BEGIN{OFS=”:”;ORS=”/n/n”}{print$1,$2}’awk_file
数据变量:
awk ‘BEGIN{print ARGC ,ARGV[1]}’ awk_file
注意:和shell变量不同,当你在脚本中指定一个这样的变量时,不需要在变量前面加“$”
2、用户自定义的变量 在awk中变量不需要声明,awk会通过表达式中变量的上下文来推断数据的类型,如果变量没有初始化,awk会把字符变量初始化为空值,把数字变量初始化为零。
在脚本中指定的变量 变量等于表达式
表示打印出在/etc/passwd中以“:”为分隔符以bin开头第三个字段的值乘以6的结果
3、在命令行中指定变量
变量可以在命令行中指定然后传递到awk脚本中,如:
但是在BEGIN表达式中不能这样用,要加 –v 参数,即每个在命令行里传递的参数必须要有 –v 参数跟其在后面。
4、重定向和管道
输出重定向:文件名字必须要用双引号引起来,如:
输入重定向:要用到getline函数,此函数可以用来读取从标准输入、管道、或者一个文件(不是当前跟随着的文件),这个函数得到输入的下一行并设置内置变量NF,NR,FNR
九、控制表达式
if,while,if-else,do-while,for,break,continue,next,exit
if (condition) statement1
if (condition){statement1;statement2;…}
if (condition) statement1;else statement2
while loop:
while (condition)
body
do-while loop:
do
body
while (condition)
for loop:
for (initialization; condition; increment)
body
格式化输出:printf
printf “format string”,var1,var2…
The format specifiers use the format:
%[modifier]control-letter
Format Specifier Control Letters
内置Arithmetic 函数