上回用的是-F(其实如果标准化一点,在BEGIN{}里还可以区分成输入输出的FS和OFS)、NR(当前行数)、NF(当前域数)和$0(当前行全部内容),如果是一般的处理,这些差不多也就够了。

今天再学两个东东,RS和RT。

RS,也就是行分割符;RT,咋翻译,我看了好一会man文档也没搞懂,大概的说,如果RS是单字符的话,RT==RS,如果RS用了正则表达式的话,RT就是当前行RS的内容——也不知道这么说是否准确,目前就理解到这步。注意:RT是GNU awk的扩展功能,所以可能有些平台上不支持。呵呵~~

说实话,理解这个RS颇是花了我不少脑细胞去想象。直到看到一个网页,大概意思是这样: 假如test内容是: 123 456 abc def ABC DEF 654 321 那么对于类UNIX系统来说,test文件内容其实是123 456\nabc def\nABC DEF\n654 321 awk默认的RS,就是”\n”(默认FS是” “和”\t”即tab),每碰见一个RS,awk就停下来,输入space处理。假如一直没有RS,就输完全部文件为止。 如果在BEGIN{}里另外定义RS的话,要注意的是,这个时候”\n”还不会成为字符出现,而是自动转为默认的FS。

对test的实验过程如下:

[root@raocl ~]# cat test
123 456
abc def
ABC DEF
654 321
[root@raocl ~]# awk '{print $1}' test
123
abc
ABC
654[root@raocl ~]# awk 'BEGIN{RS="ABC"}{print $1}' test
123
DEF
[root@raocl ~]# awk 'BEGIN{RS="ABC";FS=" "}{print $1}' test
123
DEF
[root@raocl ~]# awk 'BEGIN{RS="ABC";FS="\n"}{print $1}' test
123 456
DEF
[root@raocl ~]# awk 'BEGIN{RS="ABC";FS="abc"}{print $1}' test
123 456
DEF
654 321
[root@raocl ~]# awk 'BEGIN{RS="ABC";FS="\t"}{print $1}' test
123 456
abc def
DEF
654 321

我是似乎明白了,不知道路过我博客的同仁们明白了么?

然后说RT,还是用实验来证明吧:

[root@raocl ~]# awk 'BEGIN{RS="ABC";FS="\t"}{print $1,RT}' ts
123 456
abc def
ABC
DEF
654 321
[root@raocl ~]# awk 'BEGIN{RS="ABC";FS="\t"}{print $1,RS}' ts
123 456
abc def
ABC
DEF
654 321
ABC

对了,还记得上回取上一行用的办法么?我再试试:

[root@raocl ~]# awk 'BEGIN{RS="ABC";FS="\t"}{print $1,x}{x=RT}' ts
123 456
abc def
DEF
654 321
ABC

也是打印出来上一行的RT了。 这个都是同一的字符做RS,下面转载一个复杂的正则匹配RS的例子:

[root@mip blog]# cat TR_file
Sun Jan 2 07:42:56 2000
Database mounted in Exclusive Mode
Completed: ALTER DATABASE MOUNT
Sun Jan 2 07:42:56 2000
Database tested in Exclusive Mode
Completed: ALTER DATABASE MOUNT
abc Jan 2 12:42:56 2000
Database mounted in Exclusive Mode
Completed: ALTER DATABASE MOUNT
Sun Jan 2 23:00:00 2009
Database mounted in Exclusive Mode
Completed: ALTER DATABASE MOUNT
[root@mip blog]# awk -v RS='[[:alpha:]]+ [[:alpha:]]+ [0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]' '$0~/mounted/{print s}{s=RT}'
RT_file
Sun Jan 2 07:42:56
abc Jan 2 12:42:56
Sun Jan 2 23:00:00