awk之RS

820阅读 0评论2016-01-14 sync_1521
分类:LINUX

RS记录分隔符
当RS=""时,以空白行为记录分隔符,开始和结尾的空白行会被忽略掉,就跟FS为默认值时,行开头和结尾的空白字符被忽略一样
test@server:/tmp> cat -n 1
     1
     2  a a a
     3  b b
     4
     5
     6  d ca
     7
     8
test@server:/tmp> awk -vRS="" '{print NR,$0}' 1
1 a a a
b b
2 d ca
test@server:/tmp>

下面举例说明在不同RS情况下的真实FS
一.当RS不为默认的\n,且不为空
     (1)指定FS,即FS不为默认的空格时,只有指定的FS才为真实的FS,\n不会成为FS
        test@server:/tmp> cat 1
        a a     a #ac
        dd
        b
        d ca
        test@server:/tmp> 
        test@server:/tmp> awk 'BEGIN{RS="b";FS="#"}NR==1{print $1}' 1
        a a     a 
        test@server:/tmp> awk 'BEGIN{RS="b";FS="#"}NR==1{print $2}' 1
        ac
        dd
        
        test@server:/tmp> 
     (2)不指定FS,即FS为默认的空格时,\n和空格以及\t都会成为FS
        test@server:/tmp> cat 1
        a a     a #ac
        dd
        b
        d ca
        test@server:/tmp> awk 'BEGIN{RS="b"}NR==1{print $1}' 1
        a
        test@server:/tmp> awk 'BEGIN{RS="b"}NR==1{print $2}' 1
        a
        test@server:/tmp> awk 'BEGIN{RS="b"}NR==1{print $3}' 1
        a
        test@server:/tmp> awk 'BEGIN{RS="b"}NR==1{print $4}' 1
        #ac
        test@server:/tmp> awk 'BEGIN{RS="b"}NR==1{print $5}' 1
        dd
        test@server:/tmp>
二.当RS为空
     (1)指定FS,即FS不为默认的空格时,\n和指定的FS会成为真实的FS
        test@server:/tmp> cat 1
        a a     a #ac
        dd
        
        b
        d ca
        test@server:/tmp> awk 'BEGIN{RS="";FS="#"}NR==1{print $1}' 1
        a a     a 
        test@server:/tmp> awk 'BEGIN{RS="";FS="#"}NR==1{print $2}' 1
        ac
        test@server:/tmp> awk 'BEGIN{RS="";FS="#"}NR==1{print $3}' 1
        dd
     (2)不指定FS,即FS为默认的空格时,\n和空格以及\t都会成为FS
        test@server:/tmp> cat 1
        a a     a #ac
        dd
        
        b
        d ca
        test@server:/tmp> awk 'BEGIN{RS=""}NR==1{print $1}' 1
        a
        test@server:/tmp> awk 'BEGIN{RS=""}NR==1{print $2}' 1
        a
        test@server:/tmp> awk 'BEGIN{RS=""}NR==1{print $3}' 1
        a
        test@server:/tmp> awk 'BEGIN{RS=""}NR==1{print $4}' 1
        #ac
        test@server:/tmp> awk 'BEGIN{RS=""}NR==1{print $5}' 1
        dd
        test@server:/tmp>

上一篇:iRedMail命令行管理postfix队列
下一篇:CentOS防火墙的设置与优化