shell学习笔记4---awk的执行顺序控制(原创)

简介:

next和getline

next语句从输入文件中读取下一行,然后从头开始执行awk脚本。如:

{if ($1 ~/test/){next} else {print} }
getline从整体上来说,应这么理解它的用法:
当其左右无重定向符 | 或 < 时,getline作用于当前文件,读入当前文件的下一行给其后跟的变量var或$0(无变量);应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。
当其左右有重定向符 | 或 < 时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

next和getline在awk执行过程中都用于读取下一行数据,但他们却有着很重要的不同。next读取下一行之后,把控制权交给了awk脚本的顶部,及next后面的语句将被忽略,重头执行那个awk的action,同时内置变量FNR等被重置。而getline却没有改变脚本的控制,读取下一行之后,继续运行当前的awk脚本,内置变量也不会被重置。getline执行之后,会覆盖$0的内容。

下面看看他们的具体用法和实际例子

next

$ cat file1
a 1
a 1
b 2
c 3
d 4
a 1

$ awk '{print $0;next}' file1

a 1
a 1
b 2
c 3
d 4
a 1
$ awk '{next;print $0}' file1
$ awk '{if($1~/a/)print $0;next} /b/{print $0}' file1
a 1
a 1
a 1
$ awk '{if($1~/a/)print $0;next;if($1~/b/);print $0} /b/{print $0}' file1
a 1
a 1
a 1
$ awk '{if($1~/a/)print $0;next;if($1~/b/) print $0} /b/{print $0}' file1
a 1
a 1
a 1

可以看到next后面的命令都没有执行,awk执行返回了命令顶部,读取下一行数据执行相应action

getline
$ awk '{getline;print $0,NR} ' file1
a 1 2
c 3 4
a 1 6
$ awk '{print $0,NR;getline} ' file1
a 1 1
b 2 3
d 4 5
$ awk '{getline;print $0,NR;getline} ' file1
a 1 2
d 4 5

隔行处理数据

$ awk '{print $0,NR;getline} {print $0,NR}' file1
a 1 1
a 1 2
b 2 3
c 3 4
d 4 5
a 1 6

上里的操作顺序如下

'{print $0,NR}' file1------>getline------->{print $0,NR}------->'{print $0,NR}' file1

可以看到getline的操作是读取下一行数据到内存中

exit
在 awk中exit的执行有两种情况:当exit语句不在 END中时,任何操作中的exit命令表现得如同到了文件尾,所有模式或操作执行将停止,END模式中的操作被执行。而出现在END中的exit将导致程序终止。退出状态为0代表成功,非零值表示出错。

$ awk '{if ($2>3 && $2<5) exit;else print $0,NR}' file1
a 1 1
a 1 2
b 2 3
c 3 4

 

参考至:http://www.chinaunix.net/old_jh/24/691456.html

                 http://man.lupaworld.com/content/manage/ringkee/awk.htm

                 http://www.cnblogs.com/chengmo/archive/2010/10/04/1842073.html

                 http://www.51osos.com/a/Linux_CentOS_RedHat/Shellbiancheng/2010/1124/awk-getline.html

                 http://bbs.linuxpk.com/thread-43657-1-1.html

本文原创,转载请注明出处、作者

如有错误,欢迎指正

邮箱:czmcj@163.com

作者:czmmiao  文章出处:http://czmmiao.iteye.com/blog/1885572
相关文章
|
6月前
|
Shell Linux C++
Linux C/C++ 开发(学习笔记二):Shell脚本编程案例
Linux C/C++ 开发(学习笔记二):Shell脚本编程案例
106 0
|
运维 Shell C语言
运维(20)- shell awk
运维(20)- shell awk
55 0
|
11月前
|
Shell 数据处理 Perl
shell脚本里的三剑客之一awk
shell脚本里的三剑客之一awk
89 2
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
存储 Java Shell
shell学习笔记(详细整理)
这篇文章是一份详细的Shell学习笔记,涵盖了Shell的基础知识、脚本编写、变量、运算符、条件判断、流程控制、函数以及常用Shell工具的使用。
44 1
|
4月前
|
Shell Linux Perl
shell 编程中 awk ,wc ,$0,$1 等 命令的使用总结
shell 编程中 awk ,wc ,$0,$1 等 命令的使用总结
133 0
|
6月前
|
Shell Linux Perl
Linux|如何允许 awk 使用 Shell 变量
Linux|如何允许 awk 使用 Shell 变量
90 2
|
6月前
|
Shell Perl
shell学习(十) 【shell awk基本语法】
shell学习(十) 【shell awk基本语法】
33 1
|
6月前
|
存储 Shell 索引
第七章 Shell文本处理三剑客之awk
第七章 Shell文本处理三剑客之awk
下一篇
无影云桌面