awk变量应用之使用RS和RT,有需要的朋友可以参考学习下。 如果标准化一点,在BEGIN{}里可以区分成输入输出的FS和OFS、NR(当前行数)、NF(当前域数)和$0(当前行全部内容),如果仅是作一般的处理,这些也够用了。 本文为大家介绍另外两个好东东,RS和RT。
RS,也就是行分割符; 说实话,理解这个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
我是似乎明白了。
复制代码代码如下:
[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。
复制代码代码如下:
[root@mip blog]# cat TR_file
(责任编辑:IT)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 |