`
chinamming
  • 浏览: 151494 次
  • 性别: 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 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学习笔记.doc

    **一.2 为什么使用AWK?** AWK的强大之处在于其内置的数据处理功能和灵活性。它可以直接读取文件并基于行进行操作,对于处理CSV、日志文件或其他结构化数据非常有效。此外,AWK的脚本简洁,易于编写,使得快速实现...

    awk命令详解大全

    为什么使用awk? - **文本处理需求普遍**:在日常工作中,我们经常需要处理文本文件中的数据,这些文件通常没有固定的结构或格式,普通人也能轻松编辑和理解。与数据库相比,awk更适用于处理这类非结构化的文本文件...

    AWK命令详解

    #### 为什么使用AWK? **1. 文本处理的高效性** AWK针对文本模式扫描和处理进行了优化,尤其适合处理大量非结构化文本数据。与数据库系统相比,AWK处理的文本文件通常无需特殊格式,易于人类阅读和理解,使文本...

    awk详细用法小结awk awk

    通过上述总结,我们可以看出awk是一个功能极其强大的文本处理工具,它不仅可以用于简单的文本搜索和替换,还能进行复杂的数据分析和报告生成。掌握awk的基本用法和高级技巧,对于提高工作效率和数据处理能力具有重要...

    awk入门到精通.pdf

    《awk入门到精通》这本书是一本专为学习awk语言设计的指南,主要关注awk适用的问题类型和常用的解题策略。作者希望通过一系列具有代表性的实例,帮助读者快速掌握awk的使用技巧和特性。书中实例逐步深入,互相连贯,...

    linux环境下awk开发

    #### 三、为什么使用AWK? 1. **文本处理的强大性**:AWK特别适合处理文本文件,这些文件没有特定的格式限制,易于编辑和理解。尽管数据库也是常见的数据处理方式,但对于非结构化文本数据而言,AWK更加便捷高效。 ...

    MOXA_AWK-3121配置方法及要点说明

    MOXA AWK-3121 配置方法及要点说明 MOXA AWK-3121 是一种工业级无线设备,具有 web 功能配置、IP 网络参数设置、工作模式选择、功率增强等特点。本文将详细介绍 MOXA AWK-3121 的配置方法及要点说明。 一、Web ...

    awk参考资料下载awk

    【awk参考资料】深入理解awk ...总的来说,awk通过灵活的模式匹配和丰富的操作,为文本处理提供了强大的能力,是Linux系统中不可或缺的工具之一。学习并熟练掌握awk,将极大地提升你在文本处理和数据分析方面的效率。

    巧用AWK处理二进制数据文件

    在实际工作中,我们可能需要根据不同的数据结构和输出要求,设计AWK脚本来满足我们的需求。例如,我们可以使用FS变量来定义字段分隔符,使用ORS变量来定义输出记录分隔符。 使用AWK处理二进制数据文件需要组合多种...

    The AWK Programming Language 中文版

    AWK是一种专门为文本处理和数据分析而设计的编程语言。它适合于快速编写简短但功能强大的程序来完成特定任务。AWK的语法简洁,提供了丰富的内置函数和灵活的数据处理能力,使得它成为数据处理领域中的一个利器。AWK...

    awk教程-awk教程.rar

    - **字段(Field)**:awk默认使用空格或制表符作为字段分隔符,将一行文本划分为多个字段。每个字段可以通过$1, $2, ... $NF引用,其中$NF表示最后一个字段。 - **模式(Pattern)**:模式可以是正则表达式或简单...

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

    - **记录**(Record):awk将输入视为一系列记录,默认情况下,每行被视为一条记录。记录数量可通过变量 `NR` 获取。 - **字段**(Field):每条记录可以分解为多个字段,默认使用空白字符(如空格、制表符等)分隔...

    ass109.awk

    对于不同的Oracle版本或不同的性能问题,可能需要使用其他工具或定制化awk脚本来进行更深入的分析。同时,理解Oracle的内部工作原理和熟悉SQL优化技巧是有效利用此工具的关键。 在实际应用中,"ass109.awk" 只是...

    Effective awk Programming, 4th Edition[awk高效编程4版]

    《Effective awk Programming, 4th Edition》是一本深入讲解awk编程技术的专业书籍,旨在帮助读者提升在文本处理和...通过这本书的学习,你将能充分利用awk的强大功能,为日常的文本分析和数据操作带来显著的效率提升。

Global site tag (gtag.js) - Google Analytics