[toc]
awk内置变量
$0	表示匹配的整行
文件 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
使用 $0 打印整行
$ awk '{print $0}' 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
NR	  总的行号
文件 a.txt 内容如下
101,abc,CEO
102,def,CTO
103,qaz,COO
文件 b.txt 内容如下
666,ABC,CEO
777,DEF,CTO
888,QAZ,COO
NR 会统计多个文件的总行号
$ 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	当前文件的行号
FNR 只统计每个文件的行号
$ 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	文件最后一列
$ awk -F: '{print $NF}' /etc/passwd | head
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/usr/sbin/nologin
/usr/sbin/nologin
分隔符
- 
record字段 - 
separator分隔符 
| 变量名 | 对应单词 | 含义 | 
|---|---|---|
FS | field separator | 字段分隔符,默认空格或 tab | 
OFS | output field separator | 输出分隔符,默认空格 | 
RS | record separator | 记录分隔符,默认换行符 \n | 
ORS | output record separator | 输出记录分隔符 | 
FS 指定字段分隔符
文件 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
- -F写法
 - BEGIN {FS}写法
 
$ awk -F: '{print $1}' passwd.txt 
root
bin
daemon
$ awk 'BEGIN{FS=":"}{print $1}' passwd.txt 
root
bin
daemon
OFS 指定输出分隔符
文件 a.txt 内容如下
1 2 3
a b c
D F 6
示例:打印文件第一列和第三列,以冒号为分隔符
- -v OFS写法
 - BEGIN {OFS}写法
 
注意
-v OFS 写法的一个坑:当 print $0 的时候,-v OFS 会不生效
$ awk -v OFS=: '{print $0}' a.txt 
1 2 3
a b c
D F 6
解决方法是在 print$0 前加一个 $1=$1
$ awk -v OFS=: '{$1=$1;print $0}' a.txt 
1:2:3
a:b:c
D:F:6
$ awk -v OFS=: '{print $1,$3}' a.txt 
1:3
a:c
D:6
$ awk 'BEGIN{OFS=":"}{print $1,$3}' a.txt 
1:3
a:c
D:6
RS	指定记录分隔符,即指定以什么为分隔符,默认为 \n
文件 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
示例:将文件的记录分隔符指定为 / ,即指定文件以 / 为换行符
- -v RS写法
 - BEGIN {RS}写法
 
$ awk -v RS=/ '{print $0}' 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
$ awk 'BEGIN{RS="/"}{print $0}' 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
ORS 指定输出记录分隔符
文件 a.txt 内容如下
1 2 3
a b c
D F 6
示例:将文件的输出记录分隔符指定为 /
- -v ORS写法
 - BEGIN {ORS}写法
 
$ awk -v ORS="/" '{print $0}' a.txt
1 2 3/a b c/D F 6/
$ awk 'BEGIN{ORS="/"}{print $0}' a.txt
1 2 3/a b c/D F 6/

