RS即Record Separator的缩写,记录分隔符的意思。awk从输入中读取数据的时候,工具RS的定义将输入分割为许多Records,awk的每循环一次读取一个Record进行处理。
awk中默认的记录分隔符(RS)为换行符(\n),因此awk一般都是一次处理一行数据。
有时候,在输入文件中,一行信息可能包含了多条需要处理的记录,这个时候就需要重新设置RS的值了,例如下面的情况
CodingAnts@ubuntu:~/awk$ cat url <a href="link1">coding</a><a href="link2">ants</a><a href="link3">awk</a>
名为url的文件中只有一行数据,其中包含了3个a标签,那如果我们需要把这三个标签中的url地址提取出来的话,按照默认的RS设定就无能为力了,因此就需要重新设定RS的值。
CodingAnts@ubuntu:~/awk$ cat url | awk 'BEGIN {RS="</a>"} {print NR,$0}' 1 <a href="link1">coding 2 <a href="link2">ants 3 <a href="link3">awk 4
通过设置RS=”</a>”后,就可以将在同一行上的三个a标签分割为3个Record了,但是上面的输出中却有4条记录,这个又是什么情况呢?
仔细观察下就好发现,第四条记录是一个换行符,以</a>作为分割符后,最后一个</a>后面的换行符也被当做一条记录了。显然,这个不符合我们的要求,需要去除这条记录,这就需要在Pattern(模式)中进行设定了,具体如下:
CodingAnts@ubuntu:~/awk$ cat url | awk 'BEGIN {RS="</a>"} NF>0{print $0"</a>"}' <a href="link1">coding</a> <a href="link2">ants</a> <a href="link3">awk</a>
在Pattern中设定NF>0后,第4条记录即被排除掉了,因为第四条记录只有一个换行符,其NF=0。得到上面的输出后,下一步提取url地址的操作就很方便了,设置字段分隔符FS为”,则$2的值就为url地址了。
CodingAnts@ubuntu:~/awk$ cat url | awk 'BEGIN {RS="</a>"} NF>0{print $0}' | awk 'BEGIN {FS="\""} {print $2}' link1 link2 link3
转载请注明:Coding Ants » awk内建变量示例详解之记录分隔符:RS