awk使用说明
程序员文章站
2022-07-11 08:00:31
...
一、简介
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
二、语法格式
awk '{pattern + action}' {filename}
其中pattern表示AWK在数据中查找的内容,可以是正则表达式,用斜杠括起来,action是在找到匹配内容时所执行的一系列命令。通常AWK以文件的一行为处理单位,然后执行相关的命令来处理文件。
三、三种调用方式
1、awk命令行
可以像使用普通UNIX命令一样使用awk,在命令行中也可以使用awk程序设计语言,虽然awk支持多行的录入,但是录入长长的命令行并保证其正确无误却是一件令人头疼的事,因此,这种方法一般只用于解决简单的问题。
awk [-F field-separator] 'commands' input-file(s)
其中-F(分隔符)是可选的,commands是真正的awk命令,input-file(s)是待处理的文件
2、使用-f选项调用awk程序
awk允许将一段awk程序写入一个文本文件,然后在awk命令行中用-f选项调用并执行这段程序。
awk -f awk-file input-file(s)
其中,-f选项加载awk-file中的awk脚本
3、利用命令解释器(shell脚本)调用awk程序
利用UNIX支持的命令解释器功能,我们可以将一段awk程序写入文本文件,然后在它的第一行加上:
#!/bin/awk -f
并赋予这个文本文件以执行的权限。这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awk程序了。
awk 脚本文本名 待处理文件
四、数据类型
awk仅有两个主要的数据类型:字符串和数字。同时awk的字符串和数字可以相互转换,字符串能够被解释为数字并把它的值转换为数字,如果不包含数字将转化为0。
它们都可以在代码里的action部分使用 = 操作符给变量赋值,我们可以在任意时刻、任意地方声明和使用变量,也可以使用未初始化的变量,此时它们默认的值是空字符串""。
最后awk有数组类型,并且它们是动态的一维关联数组。它们的语法是这样的:
var[key] = value
awk可以模拟多维数组,但无论如何这是一个大的技巧。
五、内置变量
awk提供了很多内置变量,了解这些内置变量的使用很有必要,下面给出一些常用的变量:
ARGC 命令行参数个数(不包括awk的选项和程序内容)
ARGIND 当前正在处理的ARGV中的文件的索引值(同时处理多个文件时会用到)
ARGV 命令行参数序列数组,下标从0开始
ENVIRON 当前系统的环境变量
ERRNO 出错时的错误信息
FILENAME 当前正在处理的文件名,该变量不能在BEGIN块中使用
FNR 浏览文件的记录数
FS 字段的分隔符,默认为空格,等价于命令行-F 选项
NF 当前记录中的域的个数
NR 已经读出的记录数
OFS 输出的字段分隔符,默认为空格
ORS 输出的记录分隔符,默认为新行
RS 输入记录的分隔符,默认为新行
六、模式
可以使用的模式分为三大类:正则表达式、布尔表达式和特殊模式。
1、正则表达式比较轻量。它们不是Awk下的PCRE(但是gawk可以支持该库——这依赖于具体的实现!请使用 awk –version查看),然而,对于大部分的使用需求已经足够了。注意,模式不能捕获特定的组(groups)使它们在代码的ACTION部分执行。模式是专门匹配内容的。
2、布尔表达式与PHP或者Javascript中的布尔表达式类似。特别的是,在awk中可以使用&&(“与”)、||(“或”)、!(“非”)操作符。你几乎可以在所有类C语言中找到它们的踪迹。它们可以对常规数据进行操作。
与PHP和Javascript更相似的特性是比较操作符,==,它会进行模糊匹配(fuzzy matching)。因此“23”字符串等于23,”23″ == 23 表达式返回true。!= 操作符同样在awk里使用,并且别忘了其他常见的操作符:>,<,>=,和<=。你同样可以混合使用它们:布尔表达式可以和常规表达式一起使用。 /admin/ || debug == true 这种用法是合法的,并且在遇到包含“admin”单词的行或者debug变量等于true时该表达式就会匹配成功。
3、在Awk里有一些特殊的模式,但不是很多。
第一个是BEGIN,它仅在所有的行都输入到文件之前进行匹配。这是你可以初始化你的脚本变量和所有种类的状态的主要地方。
另外一个就是END。就像你可能已经猜到的,它会在所有的输入都被处理完后进行匹配。这使你可以在退出前进行清除工作和一些最后的输出。
七、实例
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
二、语法格式
awk '{pattern + action}' {filename}
其中pattern表示AWK在数据中查找的内容,可以是正则表达式,用斜杠括起来,action是在找到匹配内容时所执行的一系列命令。通常AWK以文件的一行为处理单位,然后执行相关的命令来处理文件。
三、三种调用方式
1、awk命令行
可以像使用普通UNIX命令一样使用awk,在命令行中也可以使用awk程序设计语言,虽然awk支持多行的录入,但是录入长长的命令行并保证其正确无误却是一件令人头疼的事,因此,这种方法一般只用于解决简单的问题。
awk [-F field-separator] 'commands' input-file(s)
其中-F(分隔符)是可选的,commands是真正的awk命令,input-file(s)是待处理的文件
2、使用-f选项调用awk程序
awk允许将一段awk程序写入一个文本文件,然后在awk命令行中用-f选项调用并执行这段程序。
awk -f awk-file input-file(s)
其中,-f选项加载awk-file中的awk脚本
3、利用命令解释器(shell脚本)调用awk程序
利用UNIX支持的命令解释器功能,我们可以将一段awk程序写入文本文件,然后在它的第一行加上:
#!/bin/awk -f
并赋予这个文本文件以执行的权限。这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awk程序了。
awk 脚本文本名 待处理文件
四、数据类型
awk仅有两个主要的数据类型:字符串和数字。同时awk的字符串和数字可以相互转换,字符串能够被解释为数字并把它的值转换为数字,如果不包含数字将转化为0。
它们都可以在代码里的action部分使用 = 操作符给变量赋值,我们可以在任意时刻、任意地方声明和使用变量,也可以使用未初始化的变量,此时它们默认的值是空字符串""。
最后awk有数组类型,并且它们是动态的一维关联数组。它们的语法是这样的:
var[key] = value
awk可以模拟多维数组,但无论如何这是一个大的技巧。
五、内置变量
awk提供了很多内置变量,了解这些内置变量的使用很有必要,下面给出一些常用的变量:
ARGC 命令行参数个数(不包括awk的选项和程序内容)
ARGIND 当前正在处理的ARGV中的文件的索引值(同时处理多个文件时会用到)
ARGV 命令行参数序列数组,下标从0开始
ENVIRON 当前系统的环境变量
ERRNO 出错时的错误信息
FILENAME 当前正在处理的文件名,该变量不能在BEGIN块中使用
FNR 浏览文件的记录数
FS 字段的分隔符,默认为空格,等价于命令行-F 选项
NF 当前记录中的域的个数
NR 已经读出的记录数
OFS 输出的字段分隔符,默认为空格
ORS 输出的记录分隔符,默认为新行
RS 输入记录的分隔符,默认为新行
六、模式
可以使用的模式分为三大类:正则表达式、布尔表达式和特殊模式。
1、正则表达式比较轻量。它们不是Awk下的PCRE(但是gawk可以支持该库——这依赖于具体的实现!请使用 awk –version查看),然而,对于大部分的使用需求已经足够了。注意,模式不能捕获特定的组(groups)使它们在代码的ACTION部分执行。模式是专门匹配内容的。
2、布尔表达式与PHP或者Javascript中的布尔表达式类似。特别的是,在awk中可以使用&&(“与”)、||(“或”)、!(“非”)操作符。你几乎可以在所有类C语言中找到它们的踪迹。它们可以对常规数据进行操作。
与PHP和Javascript更相似的特性是比较操作符,==,它会进行模糊匹配(fuzzy matching)。因此“23”字符串等于23,”23″ == 23 表达式返回true。!= 操作符同样在awk里使用,并且别忘了其他常见的操作符:>,<,>=,和<=。你同样可以混合使用它们:布尔表达式可以和常规表达式一起使用。 /admin/ || debug == true 这种用法是合法的,并且在遇到包含“admin”单词的行或者debug变量等于true时该表达式就会匹配成功。
3、在Awk里有一些特殊的模式,但不是很多。
第一个是BEGIN,它仅在所有的行都输入到文件之前进行匹配。这是你可以初始化你的脚本变量和所有种类的状态的主要地方。
另外一个就是END。就像你可能已经猜到的,它会在所有的输入都被处理完后进行匹配。这使你可以在退出前进行清除工作和一些最后的输出。
七、实例