awk的程序执行过程,总是先读取一部分数据到buf下,根据RS截取一段段记录下来。
RS做为awk的内置变量,即可以在awk程序中进行设置,也可以用参数的形式进行指定。
这篇文章讨论的是从awk的源码去分析在不同的RS下的三种执行分支及其相应的效率
以下开始分析源码:
首先,awk调用get_a_record 函数获取单条记录,在get_a_record函数里,先读入一段数据到buf下
iop->count = read(iop->fd, iop->buf, iop->readsize);
再对buf进行分析,根据RS截取一段记录
ret = (*matchrec)(iop, & recm, & state);
这里的matchrec 函数指针指向的函数,就是用来做RS匹配的,具体是哪个函数呢?根据不同的RS,有这么三种附值结果
if (RS->stlen == 0) {
RS_is_null = TRUE;
}
else if (RS->stlen > 1) {
matchrec = rsrescan;
}
else matchrec = rs1scan;
可见,awk的根据不同的RS,实际上是走三种流程去从buf里截取一条记录信息的。
1:默认的/n,或null, 这个在程序里,相当简洁的单字符判断(while (*bp != rs)bp++;),效率也是最高的。
2:多字符,这个实际上把RS当成了正则,调用了正则去匹配了。这里讨论下去,就是awk的正则效率问题了。
3:非/n的单字符。这个涉及到awk的历史,为了兼顾不同的locale,这里的单字符判断不似第一种那样简单的判断,还对各类字符的字符长度进行了兼容性的扩展判断,直接影响了效率
源码里很长的一段说明有兴趣的可以去看看,这边只转其中一句话:
/* Thus, the check for /n here; big speedup ! */
awk的程序执行过程,总是先读取一部分数据到buf下,根据RS截取一段段记录下来。
RS做为awk的内置变量,即可以在awk程序中进行设置,也可以用参数的形式进行指定。
这篇文章讨论的是从awk的源码去分析在不同的RS下的三种执行分支及其相应的效率
以下开始分析源码:
首先,awk调用get_a_record 函数获取单条记录,在get_a_record函数里,先读入一段数据到buf下
iop->count = read(iop->fd, iop->buf, iop->readsize);
再对buf进行分析,根据RS截取一段记录
ret = (*matchrec)(iop, & recm, & state);
这里的matchrec 函数指针指向的函数,就是用来做RS匹配的,具体是哪个函数呢?根据不同的RS,有这么三种附值结果
if (RS->stlen == 0) {
RS_is_null = TRUE;
}
else if (RS->stlen > 1) {
matchrec = rsrescan;
}
else matchrec = rs1scan;
可见,awk的根据不同的RS,实际上是走三种流程去从buf里截取一条记录信息的。
1:默认的/n,或null, 这个在程序里,相当简洁的单字符判断(while (*bp != rs)bp++;),效率也是最高的。
2:多字符,这个实际上把RS当成了正则,调用了正则去匹配了。这里讨论下去,就是awk的正则效率问题了。
3:非/n的单字符。这个涉及到awk的历史,为了兼顾不同的locale,这里的单字符判断不似第一种那样简单的判断,还对各类字符的字符长度进行了兼容性的扩展判断,直接影响了效率
源码里很长的一段说明有兴趣的可以去看看,这边只转其中一句话:
/* Thus, the check for /n here; big speedup ! */
分享到:
相关推荐
Linux 平台下编写程序语言的makefile脚本编写入门文档
1978 Awk Paper-'Awk-模式扫描和处理语言(第二版)(1978)': : 方便的Awk备忘单: : Archive.org链接到Awk编程语言PDF: : 还有一个很好的单线列表: : Karabiner Elements-可以使用点击器(模拟键盘)...
Effective AWK Programming:Awk 编程的经典著作
为使读者快速掌握awk解题的模式及特性, 本手册系由一些较具代表性的范例及其题解所构成; 各范例由浅入深, 彼此间相互连贯,范例中并对所使用的awk语法及指令辅以必要的说明. 有关 awk的指令, 函数,...等条列式的说明...
awk学习awk学习awk学习awk学习awk学习awk学习awk学习
AWK中FNR和NR,OFS和FS,RS和ORS.txt
man 中文awk版内容包括:语法、AWK变量、操作符、语句的编写,数组和函数的书写内容。
sed & awk 第二版 例程 源代码 源码 sed & awk sourcecode
sed与awk+第三版和源代码
你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是...
你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是...
完整的文档、指南和书籍快速指南 Unix/Linux 中的 AWK 命令以及 Anshika Goyal 和 Praveen Negi 的示例来自 GNU AWK 文档的一些简单示例Awk - 教程和介绍awk 示例第 1 部分,第 2部分,第 3 部分Frank Moraes 的 Awk...
GAWK: Effective AWK Programming;gAWK说明;GNU awk教程
sed与awk 编写脚本利器。
sed-awk-cheatsheet:您可以使用sed和awk做的事情
首先, 你需要先了解awk 的工作原理: 1。AWK读取输入文件一次一行。 2。对于每一行,它匹配在给定的顺序模式,如果匹配,执行相应的动作。 3。如果没有模式匹配,将执行任何行动。 4。在上面的语法,无论是搜索模式...
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
ass.awk工具用在数据库hang住时分析收集到的systemstate所用,可以清晰明了的查看systemstate中的信息; 命令简单: $ awk -f ass1033.awk [trace_name_file] 在系统hung的时候,systemstate基本等同于hanganalyze...
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。 awk其名称得...
AWK 详细使用文档 AWK 详细使用文档 AWK 详细使用文档