AWK

来源:互联网 发布:sql 删除所有表 编辑:程序博客网 时间:2024/04/28 02:07

AWK(三位创造者AhoWeinbergerKernighan统称)是一种优良的文本处理工具。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。(nawkawk的新版本,gawk AWK GNU 版本)

一,awk 命令格式

     awk ‘pattern { action }’   其中 pattern 表示 awk 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

二,运行awk 程序

a,如果程序比较短,我们可以用:

  awk options ‘program’input-file1 input-file2

   program 包含一系列的、patternsactions

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支持多种类型的匹配模式去过滤数据记录,其中BEGINEND就是两个特殊的模式: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

 自定义输出分隔符 为了改变输出字段和记录如何被分割,我们可以设定内置变量OFSORS的值,通常可以在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 函数

原创粉丝点击