跳到主要内容

[toc]

awk内置变量

$0 表示匹配的整行

//文件内容
[root@7-test1 ~]# cat passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

示例:
[root@7-test1 ~]# awk '{print $0}' passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

NR 总的行号

//文件a.txt和b.txt的内容如下
文件a.txt
101,abc,CEO
102,def,CTO
103,qaz,COO

文件b.txt
666,ABC,CEO
777,DEF,CTO
888,QAZ,COO

//打印两个文件,NR统计总的行号
[root@7-test1 ~]# awk '{print NR,$0}' a.txt b.txt
1 101,abc,CEO
2 102,def,CTO
3 103,qaz,COO
4 666,ABC,CEO
5 777,DEF,CTO
6 888,QAZ,COO

FNR 当前文件的行号

文件a.txt
101,abc,CEO
102,def,CTO
103,qaz,COO

文件b.txt
666,ABC,CEO
777,DEF,CTO
888,QAZ,COO

//打印两个文件,FNR只统计每个文件的行号
[root@7-test1 ~]# awk '{print FNR,$0}' a.txt b.txt
1 101,abc,CEO
2 102,def,CTO
3 103,qaz,COO
1 666,ABC,CEO
2 777,DEF,CTO
3 888,QAZ,COO

NF 文件最后一列

//打印/etc/passwd文件最后一列
[root@7-test1 ~]# awk -F: '{print $NF}' /etc/passwd|head
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

分隔符

record 字段

separator 分隔符

变量名对应单词含义
FSfield separator字段分隔符,默认空格或tab
OFSoutput field separator输出分隔符,默认空格
RSrecord separator记录分隔符,默认换行符\n
ORSoutput record separator输出记录分隔符

FS 指定字段分隔符

//passwd.txt文件内容如下
[root@7-test1 ~]# cat passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

示例1:以冒号为分隔符,打印文件第一列
//-F写法
[root@7-test1 ~]# awk -F: '{print $1}' passwd.txt
root
bin
daemon

//BEGIN {FS}写法
[root@7-test1 ~]# awk 'BEGIN{FS=":"}{print $1}' passwd.txt
root
bin
daemon

OFS 指定输出分隔符

//文件内容如下
[root@7-test1 ~]# cat a.txt
1 2 3

示例1:打印文件第一列和第三列,以冒号为分隔符
//-v OFS写法
[root@7-test1 ~]# awk -v OFS=: '{print $1,$3}' a.txt
1:3

//BEGIN {OFS}写法
[root@7-test1 ~]# awk 'BEGIN{OFS=":"}{print $1,$3}' a.txt
1:3


⚠️⚠️⚠️注意:!!!
-v OFS写法的一个坑:当print $0的时候,-v OFS会不生效

//正确输出应该为1:2:3
[root@7-test1 ~]# awk -v OFS=: '{print $0}' a.txt
1 2 3

解决方法
print$0前加一个$1=$1
[root@7-test1 ~]# awk -v OFS=: '{$1=$1;print $0}' a.txt
1:2:3

RS 指定记录分隔符,即指定以什么为分隔符,默认为\n

//文件内容
文件默认以换行为记录分隔符
[root@7-test1 ~]# cat passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

示例1:将文件的记录分隔符指定为/,即指定文件以/为换行符
//-v RS写法
[root@7-test1 ~]# awk -v RS=/ '{print $0}' passwd.txt
root:x:0:0:root:
root:
bin
bash
bin:x:1:1:bin:
bin:
sbin
nologin

//BEGIN {RS}写法
[root@7-test1 ~]# awk 'BEGIN{RS="/"}{print $0}' passwd.txt
root:x:0:0:root:
root:
bin
bash
bin:x:1:1:bin:
bin:
sbin
nologin

ORS 指定输出记录分隔符

//文件内容
[root@7-test1 ~]# cat a.txt
1
2
3

示例1:将文件的输出记录分隔符指定为/
//-v ORS写法
[root@7-test1 ~]# awk -v ORS="A" '{print $0}' a.txt
1A2A3A

//BEGIN {ORS}写法
[root@7-test1 ~]# awk 'BEGIN{ORS="A"}{print $0}' a.txt
1A2A3A