awk变量应用之使用RS和RT

发布时间:2020-01-15编辑:脚本学堂
awk变量应用之使用RS和RT,有需要的朋友可以参考学习下。如果标准化一点,在BEGIN{}里可以区分成输入输出的FS和OFS、NR(当前行数)、NF(当前域数)和$0(当前行全部内容),如果仅是作一般的处理,这些也够用了。

linuxjishu/13830.html target=_blank class=infotextkey>awk变量应用之使用RS和RT,有需要的朋友可以参考学习下。

如果标准化一点,在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 456nabc defnABC DEFn654 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