教程集 www.jiaochengji.com
教程集 >  脚本编程  >  shell  >  正文 (原创)awk实现head、tail与tac命令的实例解析

(原创)awk实现head、tail与tac命令的实例解析

发布时间:2014-09-20   编辑:jiaochengji.com
我们知道,命令head、tail、uniq和tac都是逐行操作的。但请也记住,不管何时,只要需要进行逐行处理时,均可以用awk来解决。

原创文章,转载请注明出处:教程集,否则追究法律责任。教程集首发!
作者:isbadboy

我们知道,命令head、tail、uniq和tac都是逐行操作的。
但请也记住,不管何时,只要需要进行逐行处理时,均可以用awk来解决。

接下来,我们看看如何使用awk来模拟这些命令。

来看一下如何用不同的awk命令来模拟诸如head、tail、tac等命令。

模拟head命令读取文件前10行并打印出来:
 

复制代码 代码如下:
$ awk 'NR <=10' filename

模拟tail命令打印文件的后10行:
 

复制代码 代码如下:
$ awk '{ buffer[NR%10] = $0;} END { for(i=1;i<11;i++) { print buffer[i%10] } }' filename

模拟tac命令逆序打印输入文件的所有行:
 

复制代码 代码如下:
$ awk '{ buffer[NR] = $0 } END { for(i=NR;i>0;i--) { print buffer[i] } }' filename

原理分析

1)、在head的实现中,我们打印输入流中行号小于或等于10的行。行号可以通过特殊变量NR获得。

2)、在tail命令的实现中,我们用到了散列技术。数组buffer的索引是由散列函数NR%10决定的,其中变量NR包含了当前行的行号,$0包含了当前的文本行。因此,%将所有余数相同的行都映射到一个特定的数组索引中。在EDN{ }语句块中,对数组的10个索引进行迭代,并打印出对应的行。

3)、在tac命令的实现中,只是将所有的行存入一个数组中。当程序流程进入EDN{ }语句块时,NR存储着最后一行的行号。然后在for循环中对NR递减到1,并在每一次循环中打印出存储的行。

您可能感兴趣的文章:
(原创)awk实现head、tail与tac命令的实例解析
linux tail命令的用法
awk基础知识(1)-使用规则
awk单行脚本快速参考
快速排序算法 原理及golang语言实现
【golang】1.14的sync.Pool原理分析
shell awk命令字符串拼接
sed单行命令大全 值得收藏
shell编程中的几个小技巧
统计CPU、内存、硬盘使用率的shell脚本(图文)

[关闭]
~ ~