Linux awk命令


1.简介

awk是一个强大的我那本分析工具,相对于grep的查找,sed的编辑,awk在齐对数据进行分析并生成报告时,显得尤为强大。
简单的来说,awk就是把文本逐行的读入,以空格为默认分隔符将每行切片,切开的的部分在进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。我们使用最多的是gawk。

2.工作原理

原理1:
当读到第一行时,匹配条件,然后执行指定的操作,接着在读取第二行数据处理,不会默认输出;
如果没有定义匹配条件,则默认时匹配所有数据行,awk隐含循环,条件匹配多少次,动作就会执行多少次。

原理2
逐行读取文本,默认以空格键为分割符,间分割所得的每个字段保存到内建变量中,并按模式或者条件执行编辑命令
sed常用于一整行的处理,而awk则比较倾向于将一行分成多个字段在进行处理。
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示

3.命令格式

awk [options] ‘{pattern + action}’ {filenames}

  • options 指命令的选项;

  • pattern 指匹配条件;

  • action 指对匹配成功的文本进行处理;

  • filenames 指查找的文件;

awk 的脚本命令主要由 2 部分组成,分别为匹配规则和执行命令。

awk 的匹配规则,和 sed 命令中的 address 部分作用相同,用来指定脚本命令可以作用到文本内容中的具体行,可以时以下任意一种:

  • 正则表达式:使用通配符的扩展集;

  • 关系表达式:使用运算符进行操作,可以时字符串或者数字的比较测试;

  • 默认匹配表达式:用运算符(匹配)和!(不匹配);

  • BEGIN语句块,pattern语句块,END语句块。

另外,整个脚本命令是使用的单引号'',而其中的执行命令部分需要使用花括号{}括起来。{}里面的内容主要是:变量或数据赋值、输出命令、内置函数、以及控制流语句等。

注意,在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。

awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给每行中的每个数据元素分配一个变量

4.命令模式

默认的情况下,awk是逐行处理文本的,也就是先处理完当前行,再处理下一行,这种默认的情况也被称为空模式。而若指定了“条件”,awk命令在处理文本时,只有满足”条件“的行才会被处理,不满足”条件“的行就不会被处理。这其实就是awk命令的模式pattern

awk命令主要有以下几种模式:

  • 空模式
    即不指定匹配条件,默认一行一行处理文本内容。

  • BEGIN模式
    即在开始处理文本之前,需要执行的操作,比如打印表头;

  • END模式
    即在文本中的所有行都处理完成后,需要执行的操作;

  • 关系运算模式
    即在指定条件时,使用关系操作符,

5.awk内置变量

awk有很多内置变量用来设置环境信息,下面列出一些常用的变量

ARGC 命令行参数个数

ARGV 命令行参数排列,是一个数组

ENVIRON 支持队列中系统环境变量的使用

FILENAME awk浏览的文件名

FNR 浏览文件的记录数,即各文件分别计数的行号

FS 设置输入域分隔符,默认为空白字符

NF 当前记录的域的个数,即当前行被分割成几列

NR 已读记录个数,行号,即当前处理的文本行的行号

OFS 输出域分隔符,默认为空白字符

ORS 输出记录分隔符,输出时用指定的符号代替换行符

RS 输入记录分隔符,指定输入时的换行符