awk命令详解
什么是AWK?
AWK是一种可以用来处理文本数据文件的工具。它是由Alfred V. Aho,Peter J. Weinberger和Brian W. Kernighan在20世纪70年代初开发的,名字是取自他们的姓氏的首字母组合。AWK使用一种称为“模式扫描器”的语言,它可以对文本数据文件进行复杂的操作,并生成报表、摘要和数据转换以及分析文件的结果。
AWK语法
AWK程序由一组规则组成,每个规则都由模式和对该模式匹配的行的处理指令组成。AWK程序的基本结构如下:
pattern { action }
这里,pattern是匹配条件,action是在匹配条件满足时执行的一组命令。
我们可以将多个规则组合在一起,这样当输入文件的一行匹配其中任何一个模式时,相关的操作就会被执行。
pattern1 { action1 }
pattern2 { action2 }
patternN { actionN }
这里,模式1到N是互斥的,每个模式都有一个相应的处理顺序(由上到下)。
还可以在规则之间使用BEGIN和END关键字指定执行的代码块,这两个关键字是特殊的模式匹配条件,它们各自在输入文件的处理之前和之后执行。
BEGIN { action }
pattern1 { action1 }
pattern2 { action2 }
...
patternN { actionN }
END { action }
AWK的内置变量
AWK提供了大量的内置变量,这些变量的值根据输入文件的属性和当前处理的行的属性而变化。
下面是一些常用的内置变量:
| 变量 | 描述 |
|-----------------|---------------------|
| $0 | 当前处理的行的完全文本|
| $1,$2,$3,... | 当前处理行的第1,2,3,...个字段 |
| NF | 当前处理行的字段数 |
| FS | 字段分隔符,默认是空格 |
| RS | 行分隔符,默认是换行符 |
| ORS | 输出的行分隔符,默认是换行符 |
| OFS | 输出的字段分隔符,默认是空格 |
| NR | 当前行号,从1开始 |
| FILENAME | 当前文件的名称 |
| ARGC | 命令行参数的个数 |
| ARGV | 命令行参数的列表 |
AWK的字符串操作
AWK提供了一组字符串操作函数,这些函数用于处理字符串数据。下表列出了其中一些常用的函数:
| 函数 | 描述 |
|-----------------|------------------------------------------------------|
| length(str) | 返回字符串str的长度 |
| index(str, substr) | 返回substr在str中第一次出现的位置,从1开始,如果没有匹配,返回0 |
| substr(str, start, len) | 返回从字符串str的start开始的长度为len的子字符串 |
| match(str, regexp) | 在字符串str中查找正则表达式regexp,返回匹配的位置或字符串 |
| gsub(regexp, replacement, str) | 使用replacement替换字符串str中所有的regexp匹配项,返回替换次数 |
| tolower(str) | 返回将字符串str中所有大写字母转换为小写字母的结果 |
| toupper(str) | 返回将字符串str中所有小写字母转换为大写字母的结果 |
AWK的算数操作符和比较操作符
AWK提供一组标准算数操作符和比较操作符,具体如下:
| 操作符 | 描述 |
|------------------|---------------------------------------|
| +,-,*,/,%,^ | 加、减、乘、除、取模、幂 |
| ==, !=, <, <=, >, >= | 相等、不等于、小于、小于等于、大于、大于等于 |
| &&, \|\|, ! | 逻辑与、逻辑或、逻辑非 |
AWK的控制结构
AWK提供了一组标准的控制结构,包括if、while、for和do-while,具体如下:
| 控制结构 | 描述 |
|------------------|----------------------------------------------------------------|
| if (condition) statement1; [else statement2;] | 如果condition为真,则执行statement1,否则执行statement2 |
| while (condition) statement; | 只要condition为真,就重复执行statement |
| do statement while (condition); | 执行statement,只要condition为真 |
| for (initial; condition; step) statement; | 从initial开始,只要condition为真,就重复执行statement;每次循环后都执行step |
| break | 终止当前循环 |
| continue | 跳过当前循环 |
AWK的示例
下面列举了一些常用的awk命令实例:
实例1:查找文件中的某个字符串
awk '/keyword/' file.txt
其中,/keyword/是匹配条件,file.txt是输入文件名。以上命令将会打印输入文件中所有包含关键字“keyword”的行。
实例2:打印指定的列
假设我们有一个文件,其中每一行都包含以下内容:
name age sex
我们可以使用以下命令来打印第2列:
awk '{print $2}' file.txt
这里,$2表示第2列,file.txt是输入文件名。以上命令将会打印输入文件中所有行的第2个字段。
实例3:计算一个文本文件中所有行的平均数
假设我们有一个文本文件,其中每一行都只包含一个数字。我们可以使用以下命令来计算这些数字的平均数:
awk '{total += $1; count++} END {print total/count}' file.txt
这里,$1表示每一行的第1个字段,total和count是变量,其中total用来累加行的总和,count用来记数。以上命令将会依次读取输入文件的所有行,将每行的数字累加到total变量中,同时增加计数器的值。最后计算平均值并打印结果。
总结
AWK是一种经典的文本处理工具,具备强大的模式匹配和文本替换能力。它支持变量、数组、字符串和命令行参数,以及丰富的内置函数和操作符。AWK的使用可以大大提高我们对大量文本文件进行数据分析和处理的效率。