友情提示:本站最近进行了改版升级,如出现显示异常,请刷新页面或清除一下缓存!

  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

相关文章

我来说说

(便于我们更好的交流)

没有交流就没有进步,在此输入您对本文的看法!
取消