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

时间: 2024-10-26 05:07:32

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

linux Shell学习笔记第一天_其它

以下是Shell学习1-2天学习笔记 ---------我是分隔符--------- 硬件去执行, 内核与硬件之间进行操作. 命令解析器. shell脚本的组成元素 系统命令 文本处理工具(sort.grep.sed.awk-) 变量 条件判断 环循结构 函数 Shell Scripts Center(SSC) ---------------------------- 非负Grep / awk 几天. 统计Wc Sort 排序 sort|head / sed字段处理 awk 数据区域判断 awk

shell学习笔记1---awk基础(原创)

awk概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用.awk的处理文本和数据的方式是这 样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),如果没有指定模式,则所有被操作所指

shell学习笔记3---awk的执行过程(原创)

awk_script的组成1.awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔2.awk_cmd由两部分组成: awk_pattern { actions }3.awk_script可以被分成多行书写,必须确保整个awk_script被单引号括起来.awk命令的一般形式awk ' BEGIN { actions }awk_pattern1 { actions }............awk_patternN { actions }END {

shell学习笔记2---awk字符串处理(原创)

awk内置字符串函数gsub(r,s) 在整个$0中用s替代r:gsub(r,s,t) 在整个t中用s替代r gsub函数有点类似于sed查找和替换.它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行.第一个函数作用于记录$0,第二个gsub函数允许指定目标,然而,如果未指定目标,缺省为$0.index(s,t):函数返回目标字符串s中查询字符串t的首位置.length(s) :返回s长度match(s,r): 测试s是否包含匹配r的字符串split(s,a,fs) 在fs

Shell学习笔记---变量的赋值与替换

声明:本文仅作学习研究使用,多数语句都是为了介绍语法而构造的.  建议读者先将以下命令分别执行后再整合成脚本,这样会对变量的整个赋值过程理解更透彻.  #!/bin/bash #Filename:prameter_practise1 #Datetime:2010_12_24 08:25 #Discription:Practise of using prameters a=375 hello=$a  #------------------------------------------------

linux Shell学习笔记第二天_其它

变量 获取本机主机名 #hostname 获取本系统版本号 #uname -r 获取cpu类型 获取cpu的工作频率 cat /proc/cpuinfo 获取内存使用情况 #free -m 获取硬盘使用情况 #df 变量类型及变量操作 本地变量(一般所指) 本地变量只存在用户当前shell中,当用户退出当前shell或开器一个新的shell,所设置的变量将会不存在 设置变量 #变量名=变量值 显示变量 #echo ${变量名} 假设a=1 显示则 echo ${a} 环境变量(用的非常少) 环境

linux Shell学习笔记第三天_其它

第三天:条件选择 大 纲     应用实例分析     条件测试     if-else-fi     case-in-esac 实现功能菜单: 执行脚本后 按1,显示当前时间 按2,显示CPU负载 按3,显示剩余内存 按0,退出脚本 按其他字符,提示超出选择范围后退出 分析步骤.     #date +%T     uptime awk截取     free –m 条件测试格式     #test –option obj     #[ -option obj ] 返回结果 表达式内容测试结果是

linux Shell学习笔记最后一节,温故与知新_其它

脚本编写技巧 脚本文件名命名规则         文件名的字符包括         字母.数字."."."_"和"-", 注意:脚本的文件名命名不能以数字开头. 脚本文件名的命名,尽量使用英文单词.词组或短句的缩写. 脚本版本管理:         脚本作用.主版本号.修改次数.shell类型 变量命名规范         变量名可以由数字和字母组成         变量名采用全部英文字符小写的方式         变量名称尽量使用缩写,最好不要

Shell学习笔记---重定向输入、输出(原创)

声明:本文仅作学习研究使用,多数语句都是为了介绍语法而构造的. 重定向输入.输出示例$cat         #cat把键盘看作标准输入,屏幕看作标准输出.按下CTRL+D结束键盘输入 $cat > sample.txt $cat /dev/null > /var/log/messages $cat  /etc/profile  >   /var/log/messages $cat  /etc/profile  >>  /var/log/messages     #在文件/v