读取文件
读取“每行”数据
博客的开头我们说过,默认情况下awk读取文件的每行数据并将其存入$0变量当中。其实,awk在读取数据之前会根据其内部的预定义变量RS的值来分隔每条记录(record)。RS的默认值是“n”,即换行符,因此也就会有我们刚才所说的默认情况。
所以,awk在读取文件时,会根据其自定义变量RS(Record Separator,记录分隔符)的值将文件分为多条记录来循环读取,每读取一条记录就将其赋值给$0变量,赋值完毕后再执行main代码块。
如果文件是一个空文件,那么就读取不到记录也就不会执行main代码块。
[root@c7-server ~]# touch x.log [root@c7-server ~]# awk '{print "hello world"}' x.log [root@c7-server ~]#
可以在BEGIN代码块中设置RS的值来改变awk分隔记录的方式。
[root@c7-server ~]# awk 'BEGIN{RS="com"}{print "---";print $0;print "---"}' a.txt --- ID name gender age email phone 1 Bob male 28 abc@qq. --- --- 18023394012 2 Alice female 24 def@gmail. --- ... ...
被分隔的每条记录中不会包含RS的值本身,在上述示例中即每条记录不会包含com字符串。
细心的朋友会留意到
~]# awk '{print $0}' a.txt
当我们不修改RS,上述指令在输出的时候会使得每条记录之间自动换行,看起来就好像输出数据包含了换行符(RS的默认值)。这个特点留到我们讲解另一个预定义变量ORS的时候再做解释。
那么为什么一般将RS设置在BEGIN代码块当中呢?
首先,一般来说一个文件的RS在我们使用awk处理文件之前就可以确定了,而且一般不会改动。其次,基于我们截止目前为止介绍的awk特性,如果我们在main代码块中设置RS的话,awk读取第一条记录的时候依然会使用换行符(RS的默认值)来作为分隔符,读取完第一条记录接下来才是第一次进入main代码块,然后才是设置RS的值,而且每次awk内部循环执行main时都要为RS赋相同值也没有必要(性能略微损失)。
RS为单个字符时直接使用该字符作为分隔符;RS为多个字符时被awk识别为正则表达式。
RS的特殊值
如果记录分隔符不存在于读入数据中的话,那么我们便可以在一次内部循环的情况下读取出所有的数据。
RS=”