治白癜风石家庄哪家医院好 http://pf.39.net/bdfyy/qsnbdf/190328/7004389.html背景
出发点就错了
关于awk
awk与gawk
awk语言入门
基本工作机制
数据驱动DSL
awk的使用方式
awk程序的运行方式
单个模式规则
多个模式规则
复杂一点的awk表达式
流程控制
awkArray
awk与正则表达式
表达式正则匹配模式
大小写敏感
动态正则表达式
拆分字段
格式化输出
awk表达式
awk模式
常用模式
嵌入到shell脚本中
两个面试故事
ETL开发、数仓开发面试的时候,经常也会问一点SHELL开发的知识,不过,让我很惊讶的是,有面试官居然在问这些内容:
怎么查看一个C程序、Java程序的进程信息?你常用的vi快捷键是什么?怎么查看某个程序的端口号?说一下21的意思?说一说你对管道的理解。写一个Kafka一键启动、一键关闭脚本。如何将程序在后台启动。...
这是在网上的一个帖子上看到的,大家百度一下就知道了。我不知道是真的有人在故意瞎扯,忽悠小白,还是真的有公司这么问。我面试大数据这边,经常会涉及Linuxshell的ETL或者运维,一般都会问问以下这些基础知识:
awk的数据开发模型是什么?awk的开发模式和shell有区别吗?区别在哪儿?在shell脚本中嵌入了变量,如果要配合awk开发,怎么处理的?说说你在使用awk中常用的模式有哪些?我们写点代码吧,把hadoop、yarn的进程以及对应端口查出来?我们再写一点代码吧,把HDFS上5月1号那天,小于64MB的文件找出来。背景
前一篇,小猴给大家说了说DSL,相信大家看完,对DSL有了一定的理解。很显然,你会用DSL和GPL的眼光去审视众多编写的程序。例如:Shell+SQL、Java+SQL、以及Spark+SQL。有的朋友意犹未尽,今天我们还聊DSL,只不过场景换成了Linux——经典的AWK。
出发点就错了
大部分人学习Linux的时候,都会学习awk,毫不夸张地说,大家都会把awk和其他命令一样来使用。我也diss过用awk的运维同学。awk的强大决不能仅仅把它当成一个命令来去对待它,在Linuxshell中的地位也应该摆正。
如果只是把awk当成一个命令,是不能学会awk的。
有GNUawk(gawk)的官方说明截图为证。
image-
gawk:模式扫描和处理语言。
所言非虚。
关于awk
在Linux系统中,如果我们要编写复杂的脚本,我们几乎离不开对文本的处理。例如:从一个有个格式的配置文件中读取配置、分析程序的输出等、将一些处理后的文本进行写入、或者对文档进行列处理。而对于这些小型的任务我们都需要打开IDEA来编写Java程序,那就未免有点笨重了,因为我们要不断地「编辑-编译-测试-调试...」,而且,事实上,我们使用高级语言来处理这些任务,很多时候并不会获得成正比的效率回报。
awk是一门DSL,是专门处理文本的DSL,一般我们会它来进行数据提取或者做一些文本数据处理、报告,既然是DSL,它不像GPL那样通用,但处理文本起来,一点都不含糊。它也是要玩好shell必会,也是值得花时间去学习的强大应用。
awk最初是于年在ATT的贝尔实验室开发的。当时,有不少人来编写大型的awk程序,直到Perl语言的诞生。awk名字是取几位开发人员的姓氏组合在一起。几位作者还联手创作了一本书:就叫「TheAWKProgrammingLanguage」。所以,学习awk,要把当成一门新的语言来去学习。只不过我们时候,我们将awk嵌入在shell中执行,它是一种嵌入到shell的DSL。
awk于-年期间进行了重大的修改和扩展,这也导致了年,RichardStallnam等人发布了GNUAWK。这个版本的AWK是部署最广泛的版本。它被直接包含到基于GNU的Linux软件包中。随后在年,BrainKernighan开发了NewAWK,然后有很多的BSD系统用它来避免GPLLicense的限制。
awk与gawk
这就好比Javascript与Node.js的关系,或者是Java与JRE的关系类似。awk我们前面说过,它是一门专门处理文本的DSL,而我们编写awk程序需要有一个程序来解释执行,而gawk就是awk的解释器。
所以,要注意哦,Linux下的GNU是gawk,而Mac是nawk。我们使用的Linux,例如:CentOS系统自带的其实就是gnu的gawk。本文所使用的awk也即是GNU的gawk。
image-
Java版本的实现jawk: