awk处理多行文本的记录

awk使用内置的变量RS将输入流拆分为一个个记录(record),使用FS将一个记录拆分为若干个域(field)。RS的默认值为\n,FS的默认值为空白字符。有时候会出现一个记录跨越多行的情况,这时就需要手动设置RS为记录中不会出现的字符(否则会将一个记录拆分为两个记录),如空行(RS=””)、分页符(RS=”\f”)、或者一个正则表达式(POSIX只支持单个字符,正则表达式需要gawk)。

一个示例文本如下:

spawn ssh user_00@10.10.10.1#36000
Version 123
Text Nothing
spawn ssh user_00@10.10.10.2#36000
Version 456
Text Nothing
spawn ssh user_00@10.10.10.3#36000
Version 123
Text Some Text
spawn ssh user_00@10.10.10.4#36000
Version 456
Text Another Text

每个spawn语句构成了一个记录,因此此处使用RS=”spawn”。为了提取Version为123的机器的IP,可以使用如下的脚本

#!/usr/bin/awk -f
BEGIN {RS="spawn"} 
{
	if(index($0,"Version 123"))
	{
		at_i=index($0,"user_00@");
		pound_i=index($0,"#36000");
		print substr($0,at_i+8,pound_i-at_i-8) 
	} 
}

执行结果如下

james@debian:~$ ./process.awk test.txt 
10.10.10.1
10.10.10.3
posted @ 2013-03-27 00:23  千里快哉  阅读(570)  评论(0编辑  收藏  举报