详细分析awk如何读取文件
awk读取输入文件时,每次读取一条记录(record)(默认情况下按行读取,所以此时记录就是行)。每读取一条记录,将其保存到$0
中,然后执行一次main代码段。
[root@docker-01 ~]# awk '{print $0}' a.txt
如果是空文件,则因为无法读取到任何一条记录,将导致直接关闭文件,而不会进入main代码段。
[root@docker-01 ~]# touch x.log [root@docker-01 ~]# awk '{print $0}' x.log
可设置表示输入记录分隔符的预定义变量RS(Record Separator)来改变每次读取的记录模式。
# RS=" " 、 RS="m" [root@docker-01 ~]# awk 'BEGIN{RS=" "}{print $0}' a.txt ID name gender age email phone 1 Bob male 28 abc@qq.com 18023394012 2 Alice female 24 def@gmail.com 18084925203 3 Tony male 21 aaa@163.com 17048792503 4 Kevin male 21 bbb@189.com 17023929033 5 Alex male 18 ccc@xyz.com 18185904230 6 Andy female 22 ddd@139.com 18923902352 7 Jerry female 25 exdsa@189.com 18785234906 8 Peter male 20 bax@qq.com 17729348758 9 Steven female 23 bc@sohu.com 15947893212 10 Bruce female 27 bcbd@139.com 13942943905 [root@docker-01 ~]# awk 'BEGIN{RS="m"}{print $0}' a.txt ID na e gender age e ail phone 1 Bob ale 28 abc@qq.co 18023394012 2 Alice fe ale 24 def@g ail.co 18084925203 3 Tony ale 21 aaa@163.co 17048792503 4 Kevin ale 21 bbb@189.co 17023929033 5 Alex ale 18 ccc@xyz.co 18185904230 6 Andy fe ale 22 ddd@139.co 18923902352 7 Jerry fe ale 25 exdsa@189.co 18785234906 8 Peter ale 20 bax@qq.co 17729348758 9 Steven fe ale 23 bc@sohu.co 15947893212 10 Bruce fe ale 27 bcbd@139.co
RS通常设置在BEGIN代码块中,因为要先于读取文件就确定好RS分隔符。
RS指定输入记录分隔符时,所读取的记录中是不包含分隔符字符的。例如RS="a",则$0中一定不可能出现字符a。
RS可能两种情况
RS为单个字符:直接使用该字符来分割记录
RS为多个字符:将其当作正则表达式,只要匹配正则表达式的符号,都用来分割记录
设置预定义变量IGNORECASE为非零值,正则匹配时表过忽略大小写,
兼容模式下,只有首字符才生效,下面使用正则模式去分割记录。
特殊的RS值用来解决特殊读取需求:
RS="":按段落读取 RS="