awk 中的 getline 用法解析

 

转载请注明出处:http://hi.baidu.com/leejun_2005/blog/item/702d4888928b15a60e2444b4.html

REF: http://bbs.chinaunix.net/thread-108596-1-1.html

1、getline用法简介:
getline 是awk里用于输入重定向的一个函数,他可以从标准输入/一个管道/文件读取输入, 而不只是从当前被处理的文件来处理, 他取得输入的下一行并给NF,NR,FNR等内制变量置值, 如果找到一条记录则getline返回1,如果到了文件结束(EOF)则返回0,如果错误则返回-1
man bash: search about getline
getline < file sets $0 to the next record from
file. getline x sets variable x instead.
...
In all cases, getline returns 1 for a
successful input, 0 for end of file, and -1 for an error.
awk的 getline语句用于简单地读取一条记录。如果用户有一个数据记录类似两个物理记录,那么getline将尤其有用。它完成一般字段的分离(设置字段变量$0 FNR NF NR)。如果成功则返回1,失败则返回0(到达文件尾)。如果需简单地读取一个文件,则可以编写以下代码:
例:示例getline的使用
{while(getline==1)
{
#process the inputted fields
}
}

也可以使getline保存输入数据在一个字段中,而不是通过使用getline variable的形式处理一般字段。当使用这种方式时,NF被置成0,FNR和NR被增值。
用户也可以使用getline<"filename"方式从一个给定的文件中输入数据,而不是从命令行所列内容输入数据。此时,getline将完成一般字段分离(设置字段变量$0和NF)。如果文件不存在,返回-1,成功,返回1,返回0表示失败。用户可以从给定文件中读取数据到一个变量中,也可以用stdin(标准输入设备)或一个包含这个文件名的变量代替filename。值得注意的是当使用这种方式时不修改FNR和NR。
另一种使用getline语句的方法是从UNIX命令接受输入,例如下面的例子:

例:示例从UNIX命令接受输入
{while("who -u"|getline)
{
#process each line from the who command
}
}

当然,也可以使用如下形式:

"command" | getline variable
例如:

/home/lee#awk 'BEGIN{"date"|getline var;split(var,a);print a[4]}'
16:46:26
/home/lee#awk 'BEGIN{getline name<"/dev/tty";print "yourname:"name}'
lee
yourname:lee

getline在不同环境下设置的值:

table-getline-variants summarizes the eightvariants of getline, listing which built-in variables are set by each one.

Variant

Effect

getline

Sets $0, NF, FNR, and NR

getline var

Sets var, FNR, and NR

getline < file

Sets $0 and NF

getline var < file

Sets var

command | getline

Sets $0 and NF

command | getline var

Sets var

command |& getline

Sets $0 and NF. This is a gawk extension

command |& getline var

Sets var. This is a gawk extension



==================================================================================
2、getline 用法举例:
#awk中getline获取shell命令的执行结果(不是返回值)
June@~ 21:34:59>
echo |awk '{"echo \"1 + 2\"|bc"|getline v;print v}'
3
June@~ 21:35:02>
注意:awk中使用管道调用shell命令结束后一定要close("cmd")
案例分析请见: http://hi.baidu.com/leejun_2005/blog/item/88f7b9838e794785f703a60b.html

通过在awk内使用管道,可以把shell命令的输出传送给awk
$ awk 'BEGIN{ "date" | getline date; print date; }'
Sun Mar 8 22:21:52 2009

#getline的状态返回值可以被赋值
awk '{if($6!~/6/){tmp=$0}if($6~/6/){c=getline s;if(c==0)s="";print tmp,$0,s}}' file

awk getline接收用户输入,有两种形式:
getline string < "/dev/tty"
getline string < "-"
1)提示用户输入参数getline:awk 'BEGIN{print "input sth";getline var <"-" ; print var}' # 其中 "-" 就是标准输入,很多工具都支持 "-" ,比如tar/cat等。
2)获取awk脚本的位置参数:awk 'BEGIN{print ARGV[1],ARGV[2]}' a b

getline怎样保存shell的全部输出:
awk 'BEGIN{srs=RS;RS="";"ls ./" | getline TMP;RS=srs;print TMP}'

getline直接读取文件,注意BEGIN是预处理部分,不是action部分,此时还没有准备处理文件,指针也没有指向文件第1行,在执行过程中也不会移动文件指针的。简单的说就是BEGIN部分awk是没有指针的,此时只有getline指针,awk只在 { } action部分有指针处理。
awk 'BEGIN{while (getline d<"aa") print d}'

seq 10|awk '{getline d<"aa";print d}' #如果getline直接读一个文件,那么就是逐行读取的,因为此时只有getline指针,而没有awk指针来处理该文件。


getline打印偶数行:
seq 10 | awk '{getline;print}' # 注意这个和 seq 10 | awk 'BEGIN{while(getline)print}' 有区别!
June@~ 23:07:23>
seq 10 | awk 'i++%2'
2
4
6
8
10
June@~ 23:07:27>

awk getline两行互换:
seq 10 | awk '{if(getline tmp)print tmp;print}' #一般就是判断getline的返回值 > 0 的
2
1
4
3
6
5
8
7
10
9

awk中通过system也可执行shell命令:system会返回状态码
awk 'BEGIN{ system("ls -l") }'
ps:system里面也可以利用awk的变量:system("echo ", $1)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值