awk文本处理工具
- awk也是一个数据处理工具,sed其实是以行为单位的文本处理工具,而awk则是基于 列的文本处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成 若干字段,然后输出各字段的值。
- awk语言的最基本功能是在文件或字符串中基于指定规则 来分解抽取信息,也可以基于指定的规则来输出数据。其实他更像一门编程语言,他可以自 定义变量,有条件语句,有循环,有数组,有正则,有函数等。
- awk 认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,这里的“空 白字符”包括空格、Tab,以及连续的空格和Tab等。每个非空白的部分叫做“域”,从左 到右依次是第一个域、第二个域,等等。$1、$2分别用于表示域,$0则表示全部域。
有三种方式调用awk:
1. 命令行方式
awk [-F field-separator] 'commands' input-files
- [-F域分隔符] (separator [ˈsepəreɪtər] 分离器) 是可选的,因为awk使用空格或tab键作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项。
- 如:
awk -F: ‘commands’ input-file
- 注:在linux系统中用环境变量 IFS 存储分隔符,但根据实际应用也可以改变 IFS 的值
- commands 是真正awk命令,input-files 是待处理的文件
- iput_files可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
- 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分 隔符的情况下,默认的域分隔符是空格或tab键。
2. shell 脚本方式
- 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首 行,以便通过键入脚本名称来调用。
- 相当于shell脚本首行的:#!/bin/sh可以换成:#!/bin/awk
3. 将所有的awk命令插入一个单独文件,然后调用:
- awk -f awk-script-file input-files
- 其中,-f选项加载awk-script-file中的awk脚本,input-files跟上面的是一样的。
awk的模式和动作:
- 任何awk语句都由模式和动作组成(awk_pattern { actions })。
- 在一个awk脚本中可能有许多语句。
- 模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部 分,动作将时刻保持执行状态。即省略时不对输入记录进行匹配比较就执行相应的 actions。
- 模式可以是任何条件语句或正则表达式等。awk_pattern可以是以下几种类型:
- 正则表达式用作 awk_pattern: /regexp/
- 例如:awk '/ ^[a-z]/ ' input_file
- 布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。
- 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/
- 布尔表达式中的操作符
- 关系操作符: < > <= >= == !=
- 匹配操作符:
- value ~ /regexp/ 如果value匹配/regexp/,则返回真
- value !~ /regexp/ 如果value不匹配/regexp/,则返回真
- 例如:
- &&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非)可以用于布尔表达式或者/regexp/之前。
- 例如:
- 模式包括两个特殊字段 BEGIN 和 END。
- 使用 BEGIN 语句设置计数和打印头。BEGIN 语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文本开始执行。
- END 语句用来在 awk 完成文本浏览动作后打印输出文本总数和结尾状态标志。
动作
- 实际动作在大括号{ }内指明。
- 动作大多数用来打印,但是还有些更长的代码诸如if和循环语句及循环退出结构。
- 如果不指明采取动作,awk将打印出所有浏览出来的记录。
- awk执行时,其浏览域标记为$1,2...2...n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。使用$1 , $3表示参照第1和第3域,注意这里用逗号做域分隔。
- 如果希望打印一个有5个域的记录的所有域,不必指明$1 , $2 , $3 , $4 , $5,可使用$0,意即所有域。
- 为打印一个域或所有域,使用print命令。这是一个awk动作。
awk的运行过程
1、如果BEGIN区块存在,awk执行它指定的actions。
2、awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)
3、awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。
4、把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。
5、当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤3和4,这个过程一直持续,直到awk读取到文件尾。
6、当awk读完所有的输入行后,如果存在END,就执行相应的actions。