跳到主要内容

[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 分隔符

变量名对应单词含义
FSfield separator字段分隔符,默认空格或 tab
OFSoutput field separator输出分隔符,默认空格
RSrecord separator记录分隔符,默认换行符 \n
ORSoutput 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
$ awk -F: '{print $1}' passwd.txt 
root
bin
daemon

OFS 指定输出分隔符

文件 a.txt 内容如下

1 2 3
a b c
D F 6

示例:打印文件第一列和第三列,以冒号为分隔符

注意

-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

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

示例:将文件的记录分隔符指定为 / ,即指定文件以 / 为换行符

$ 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

ORS 指定输出记录分隔符

文件 a.txt 内容如下

1 2 3
a b c
D F 6

示例:将文件的输出记录分隔符指定为 /

$ awk -v ORS="/" '{print $0}' a.txt
1 2 3/a b c/D F 6/
Right Bottom Gif
Right Top GIF