`
chinamming
  • 浏览: 141151 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

我们为什么需要awk?

 
阅读更多

我们为什么需要awk?


我并不打算一上来就向大家介绍什么是awk,那样的话会比较枯燥,也许大家还没看完就睡着了...!所以我们先来看这样一个需求:现在我们手里有一个很大的历史记录文件,是cvs格式的,一共一百多万行,它记录了历年债卷行情数据,先截取部分给大家围观下
如你所见,它有很多很多的列,现在我们要提取部分列数据出来进行分析,如何实现?肯定有小伙伴举手回答说: “使用C,C++,C#,java等语言一行一行的读取文件,然后将每一行分割,然后取出对应的列,结果写到另一个文件”. 但是我会告诉你其实我还有十几个这种不同的历史文件要处理吗?要我写十几个这样的小工具还不如杀了我算了。还好有awk,使用awk完成上述需求,只需要在命令行中输入下面这条命令:
不用怀疑,就这么简单,只要一条命令就搞定了。

awk之管中窥豹


相信看上面的例子后,各位小伙伴对awk应该有了一个感性的认识了. awk是一个强大的文本处理工具,但是它其实不仅仅是一个工具,还是一门语言。这个强大的工具的发明者是Alfred Aho 、Peter Weinberger 和 Brian Kernighan。但是这三个个家伙比较懒,没有给它认认真真的起一个名字,就简单的取了三个人的姓氏的首字母组合起来--AWK,大师们果然懒惰!
需求完成了,也见识到了awk的威力,该到我们好好的认识了解下awk了,先从上述示例解析开始.
1. “-F,”是awk的命令行选项,该选项用来指定记录的分隔符,这里我们指定“,”作为分隔符,如果我们要指定“|”作为分隔符那就是这样子 -F|. 当然-F选项不是必须的,如果没有的话它就以空格作为默认分隔符了.
2. 单引号内的内容是awk程序,这个例子中只有一条awk语句,awk的语句由模式(pattern)和与之相关的动作(action)组成,动作在{}内,规则如下:
pattern {action}
在我们的这个小例子中,NR > 2 是模式,NR是awk内置的一个变量,表示当前记录的行数.
3. printf是awk的格式化输出函数,和c语言格式化输出一样一样的.
4. $2,$4... 这些也是awk的内置变量,表示第2列,第4列...,不难理解这条awk语句的意思就是从第三行开始输出每一行的第2列,第4列,第7列,...,第22列.
上面我们通过实例解析初步了解了下awk, 算是管中窥豹吧。

awk之走马观花


前面我们管中窥豹一样的大致了解了下awk,那么接下来我就带各位小伙伴走马观花的围观下awk.

awk概要


awk的运行方式如下:
awk [option] -f program-file [--] file ...
awk [option] [--] program-text [--] file ...
awk有很多的option, -F只是其中之一,也是最常用的,这里就不一一介绍了,以后用到了再详细说明。
awk支持将awk程序写到文件中,然后通过-f来指定awk程序文件,那么对于常用的或者复杂点的awk程序我们就写到文件中, 这样不用每次都命令行中输入了,省时省力。
file就是我们要处理的文件了,可以输入多个文件,awk会顺序处理。如果没有指定file的话,awk就从标准输入读取数据。也许 有人问了,从标准输入读取的意义何在?它的意义绝不是要我们手动从键盘敲数据进去,而是利用管道.

awk程序


awk程序是有一系列"模式-动作"以及可选的用户自定义函数.
pattern { action statements }
pattern { action statements }
...
function name( parameter list ){ statement }
...

awk的变量、记录和字段


awk的变量是动态的,无需预先定义,当第一次使用时被实例化。变量的类型可以是浮点数数值或者字符串,同时兼有二者,取决于它的使用方式。
awk有一些内置变量,例如本文例子中的$2,NR等等。
awk的一条记录就是文件中的一行数据。
awk通过-F指定的字符将记录分割成一个个的字段。

awk的模式


awk有如下多种模式:
BEGIN
END
/正则表达式/
表达式
区间模式
空模式
BEGIN和END是awk的特殊模式,它们并不匹配任何输入。BEGIN模式在读取任何输入之前就被执行,而END是所有文件都处理完了之后再执行.比如我们可以BEGIN中输出一行头信息,而在END中输出一些统计信息。
对于正则表达式,它与之对应的动作只有在当前记录匹配该正则表达式才被执行。
当表达式为非0的时候,它与之对应的动作才会被执行,例如本文例子中的NR>2,就是一个表达式。
区间模式是用","分割的两个模式组成,形如begpat,endpat. begpat控制区间的开始,endpat控制区间的结束。例如:
awk 'NR == 2, NR == 4 {print $0}' file1
输出file1的2~4行。
如果模式缺失,那么awk就处理每一行。

awk的动作


awk的动作是由{}括起来的一条或者多条awk语句组成. 每条awk语句做一件事. 多条语句之间使用换行或者";"分割。
awk支持以下几类语句:
表达式
调用函数或者给变量赋值或者进行数学运算.
控制语句
控制awk程序的流程。awk使用和C语言类似的控制结构,如,if, for, while以及do等.
复合语句
复合语句是由使用{}括起来的一条或者多条语句组成。复合语句常作为if或者for等控制语句的执行体。
输入语句
使用getline命令或者next,nextfile命令.
输出语句
print或者printf.
删除语句
删除数组.

总结


本文从一个具体需求引出一段awk代码示例,然后通过对示例的解析来初步认识awk, 然后走马观花似的围观了下awk各个方面。后面有时间的话会陆续把个人用到的一些awk功能进行总结以供诸位小伙伴们围观。

我们为什么需要awk?


我并不打算一上来就向大家介绍什么是awk,那样的话会比较枯燥,也许大家还没看完就睡着了...!所以我们先来看这样一个需求:现在我们手里有一个很大的历史记录文件,是cvs格式的,一共一百多万行,它记录了历年债卷行情数据,先截取部分给大家围观下
如你所见,它有很多很多的列,现在我们要提取部分列数据出来进行分析,如何实现?肯定有小伙伴举手回答说: “使用C,C++,C#,java等语言一行一行的读取文件,然后将每一行分割,然后取出对应的列,结果写到另一个文件”. 但是我会告诉你其实我还有十几个这种不同的历史文件要处理吗?要我写十几个这样的小工具还不如杀了我算了。还好有awk,使用awk完成上述需求,只需要在命令行中输入下面这条命令:
不用怀疑,就这么简单,只要一条命令就搞定了。

awk之管中窥豹


相信看上面的例子后,各位小伙伴对awk应该有了一个感性的认识了. awk是一个强大的文本处理工具,但是它其实不仅仅是一个工具,还是一门语言。这个强大的工具的发明者是Alfred Aho 、Peter Weinberger 和 Brian Kernighan。但是这三个个家伙比较懒,没有给它认认真真的起一个名字,就简单的取了三个人的姓氏的首字母组合起来--AWK,大师们果然懒惰!
需求完成了,也见识到了awk的威力,该到我们好好的认识了解下awk了,先从上述示例解析开始.
1. “-F,”是awk的命令行选项,该选项用来指定记录的分隔符,这里我们指定“,”作为分隔符,如果我们要指定“|”作为分隔符那就是这样子 -F|. 当然-F选项不是必须的,如果没有的话它就以空格作为默认分隔符了.
2. 单引号内的内容是awk程序,这个例子中只有一条awk语句,awk的语句由模式(pattern)和与之相关的动作(action)组成,动作在{}内,规则如下:
pattern {action}
在我们的这个小例子中,NR > 2 是模式,NR是awk内置的一个变量,表示当前记录的行数.
3. printf是awk的格式化输出函数,和c语言格式化输出一样一样的.
4. $2,$4... 这些也是awk的内置变量,表示第2列,第4列...,不难理解这条awk语句的意思就是从第三行开始输出每一行的第2列,第4列,第7列,...,第22列.
上面我们通过实例解析初步了解了下awk, 算是管中窥豹吧。

awk之走马观花


前面我们管中窥豹一样的大致了解了下awk,那么接下来我就带各位小伙伴走马观花的围观下awk.

awk概要


awk的运行方式如下:
awk [option] -f program-file [--] file ...
awk [option] [--] program-text [--] file ...
awk有很多的option, -F只是其中之一,也是最常用的,这里就不一一介绍了,以后用到了再详细说明。
awk支持将awk程序写到文件中,然后通过-f来指定awk程序文件,那么对于常用的或者复杂点的awk程序我们就写到文件中, 这样不用每次都命令行中输入了,省时省力。
file就是我们要处理的文件了,可以输入多个文件,awk会顺序处理。如果没有指定file的话,awk就从标准输入读取数据。也许 有人问了,从标准输入读取的意义何在?它的意义绝不是要我们手动从键盘敲数据进去,而是利用管道.

awk程序


awk程序是有一系列"模式-动作"以及可选的用户自定义函数.
pattern { action statements }
pattern { action statements }
...
function name( parameter list ){ statement }
...

awk的变量、记录和字段


awk的变量是动态的,无需预先定义,当第一次使用时被实例化。变量的类型可以是浮点数数值或者字符串,同时兼有二者,取决于它的使用方式。
awk有一些内置变量,例如本文例子中的$2,NR等等。
awk的一条记录就是文件中的一行数据。
awk通过-F指定的字符将记录分割成一个个的字段。

awk的模式


awk有如下多种模式:
BEGIN
END
/正则表达式/
表达式
区间模式
空模式
BEGIN和END是awk的特殊模式,它们并不匹配任何输入。BEGIN模式在读取任何输入之前就被执行,而END是所有文件都处理完了之后再执行.比如我们可以BEGIN中输出一行头信息,而在END中输出一些统计信息。
对于正则表达式,它与之对应的动作只有在当前记录匹配该正则表达式才被执行。
当表达式为非0的时候,它与之对应的动作才会被执行,例如本文例子中的NR>2,就是一个表达式。
区间模式是用","分割的两个模式组成,形如begpat,endpat. begpat控制区间的开始,endpat控制区间的结束。例如:
awk 'NR == 2, NR == 4 {print $0}' file1
输出file1的2~4行。
如果模式缺失,那么awk就处理每一行。

awk的动作


awk的动作是由{}括起来的一条或者多条awk语句组成. 每条awk语句做一件事. 多条语句之间使用换行或者";"分割。
awk支持以下几类语句:
表达式
调用函数或者给变量赋值或者进行数学运算.
控制语句
控制awk程序的流程。awk使用和C语言类似的控制结构,如,if, for, while以及do等.
复合语句
复合语句是由使用{}括起来的一条或者多条语句组成。复合语句常作为if或者for等控制语句的执行体。
输入语句
使用getline命令或者next,nextfile命令.
输出语句
print或者printf.
删除语句
删除数组.

总结


本文从一个具体需求引出一段awk代码示例,然后通过对示例的解析来初步认识awk, 然后走马观花似的围观了下awk各个方面。后面有时间的话会陆续把个人用到的一些awk功能进行总结以供诸位小伙伴们围观。
分享到:
评论

相关推荐

    awk学习awk学习awk学习awk学习

    awk学习awk学习awk学习awk学习awk学习awk学习awk学习

    Awk入门教程 《Awk A Tutorial and Introduction - by Bruce Barnett》

    Awk入门教程。作者 Bruce Barnett 注:英文版。以下是目录 Why learn AWK? Basic Structure Executing an AWK script Which shell to use with AWK? Dynamic Variables The Essential Syntax of AWK ...

    awk入门到精通.pdf

    为什么使用awk awk 是一种程序语言. 它具有一般程序语言常见的功能. 因awk语言具有某些特点, 如 : 使用直译器(Interpreter)不需先行编译; 变量无类型之分 (Typeless), 可使用文字当数组的下标(Associative Array)......

    学习和理解AWK的最佳书籍Effective AWK Programming

    我们从中可以读到他们为什么发明awk,awk的长处和短处,awk的简单发展史等。这本书对awk的编程模型、基本语法有简单明了的介绍,在进行数据处理、文本处理、报表、试验算法方面的应用也有很多好的实例。  由于是88...

    AWK用法AWK用法AWK用法

    awk ‘/101/’ file 显示文件file中包含101的匹配行。 awk ‘/101/,/105/’ file awk ‘$1 == 5′ file awk ‘$1 == “CT”‘ file 注意必须带双引号 awk ‘$1 * $2 >100 ‘ file awk ‘$2 >5 && $2<=15' file

    awk使用手册

    awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是具有独立意义的英文单词,也不是几个相关单词的缩写。事实上,awk是三个人名的缩写,他们是:Aho、(Peter)Weinberg和...

    linux环境下awk开发

    awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是具有独立意义的英文单词,也不是几个相关单词的缩写。事实上,awk是三个人名的缩写,他们是:Aho、(Peter)Weinberg和...

    AWK AWK 详细使用文档

    AWK 详细使用文档 AWK 详细使用文档 AWK 详细使用文档

    awk参考资料下载awk

    awk参考资料, awk参考资料详情.

    awk详细用法小结awk awk

    因为遇到了awk问题,所以找到这个小结,共享一下

    awk用法小结--有关awk的材料

    awk用法小结 - - - by ruson 2006.4 NTU 1. awk非常适合于结构化的文本文件(行、列数据)复杂处理。相对于sed而言,它可进行复杂的编程处理,并且可以产生复杂的报表输出。 2. awk通常有三个版本,旧awk、nawk...

    awk入门级教材awk入门awk入门

    awk 是一门编程语言,它的基本操作是在一组文件上查找模式,并在包含这些模式实例的那 些行或字段上进行指定的动作。awk 使得特定数据的选择和变换操作更易于表达

    linux awk详解awk详解awk详解awk详解

    awk详解awk详解awk详解awk详解awk详解awk详解awk详解awk详解awk详解

    awk的详细介绍,awk的使用介绍

    awk的详细介绍,awk的使用介绍,awk的使用教程,awk的学习宝典

    awk实例详解——Unix下awk的使用

    精通awk命令 Unix awk使用手册.htm awk.pdf

    sed_awk.chm

    This book is about a set of oddly named UNIX utilities, sed and awk. These utilities have many things in common, including the use of regular expressions for pattern matching. Since pattern matching ...

    linux 文本扫描与处理--awk 使用手册

    什么是awk? 你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,...实际上,awk的确拥有自己的语言:awk程序设计语言,awk的三位创建者已将它正式定义为:样式扫描和处理语言。

    awk&sed 详解

    awk&sed 详解 shell awk&sed 详解 shell awk&sed 详解 shell awk&sed 详解 shell awk&sed 详解 shell awk&sed 详解 shell

    Oracle ass.awk工具

    但是如果直接来查看这个trace file,比较麻烦,这时候可以使用ass.awk 脚本来帮助我们查看trace file。 Ass.Awk 脚本在LTOM的ltom431\ltom\tom_base\tom\src目录下,其名称是:ass109.awk。这个是目前的最新版本,...

    linux-awklinux-awk

    linux-awk.doc

Global site tag (gtag.js) - Google Analytics