0
点赞
收藏
分享

微信扫一扫

awk文本处理工具

awk文本处理工具

  • awk也是一个数据处理工具,sed其实是以行为单位的文本处理工具,而awk则是基于 列的文本处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成 若干字段,然后输出各字段的值。
  • awk语言的最基本功能是在文件或字符串中基于指定规则 来分解抽取信息,也可以基于指定的规则来输出数据。其实他更像一门编程语言,他可以自 定义变量,有条件语句,有循环,有数组,有正则,有函数等。
  • awk 认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,这里的“空 白字符”包括空格、Tab,以及连续的空格和Tab等。每个非空白的部分叫做“域”,从左 到右依次是第一个域、第二个域,等等。$1、$2分别用于表示域,$0则表示全部域。

有三种方式调用awk:

1. 命令行方式

awk [-F field-separator] 'commands' input-files

awk文本处理工具_awk命令

  • [-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/,则返回真
  • 例如:

awk文本处理工具_Linux_02

  • &&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非)可以用于布尔表达式或者/regexp/之前。
  • 例如:

awk文本处理工具_分隔符_03

  • 模式包括两个特殊字段 BEGIN 和 END。
  • 使用 BEGIN 语句设置计数和打印头。BEGIN 语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文本开始执行。
  • END 语句用来在 awk 完成文本浏览动作后打印输出文本总数和结尾状态标志。

动作

  1. 实际动作在大括号{ }内指明。
  2. 动作大多数用来打印,但是还有些更长的代码诸如if和循环语句及循环退出结构。
  3. 如果不指明采取动作,awk将打印出所有浏览出来的记录。
  4. awk执行时,其浏览域标记为$1,2...2...n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。使用$1 , $3表示参照第1和第3域,注意这里用逗号做域分隔。
  5. 如果希望打印一个有5个域的记录的所有域,不必指明$1 , $2 , $3 , $4 , $5,可使用$0,意即所有域。
  6. 为打印一个域或所有域,使用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。


举报

相关推荐

0 条评论