AWK - 内置变量

发布时间 2023-08-28 18:06:57作者: C先生·

内置变量

内置变量 使用说明
NF 获取文件的每行字段数,默认按照空格区分字段。
NR 获取文件行数,空白行对应行号默认不显示。
FNR 读取单个文件,效果同NR。读取多个文件,当读到新文件,FNR方式获取的行号重新从1开始,NR延续上个文件的行号。
FS 输入字段分隔符,默认是空格。
OFS 输出字段分隔符,默认是空格。
RS 输入行分隔符,默认为换行符
ORS 输出行分隔符,默认为换行符

例子

1、NF(获取行字段)

1)获取文档每行的字段数

[root@2288H-V6 tmp]# #以nowcoder.txt作为演示文本
[root@2288H-V6 tmp]# cat nowcoder.txt
job salary
c++ 13
java 14
php 12
python 34
[root@2288H-V6 tmp]#
[root@2288H-V6 tmp]# #NF,获取nowcoder.txt每行的字段数,行字段默认空格分隔。
[root@2288H-V6 tmp]# awk '{print NF}' nowcoder.txt
2
2
2
2
2

2)输出文档的第n个字段内容

[root@2288H-V6 tmp]# awk '{print "第一列:",$1,"第二列:",$2,"最后一列:",$NF}' nowcoder.txt | column -t
第一列:  job     第二列:  salary  最后一列:  salary
第一列:  c++     第二列:  13      最后一列:  13
第一列:  java    第二列:  14      最后一列:  14
第一列:  php     第二列:  12      最后一列:  12
第一列:  python  第二列:  34      最后一列:  34

2、NR(行号输出)

1)获取文档行号

[root@2288H-V6 tmp]# #NR,获取文档的行号
[root@2288H-V6 tmp]# awk '{print NR}' nowcoder.txt
1
2
3
4
5

2)文档带行号输出

[root@2288H-V6 tmp]# awk '{print NR " " $0}' nowcoder.txt
1 job salary
2 c++ 13
3 java 14
4 php 12
5 python 34

3、FNR(行号输出)

对比FNR和NR对多个文件的输出。

[root@2288H-V6 tmp]# awk 'BEGIN{OFS="~~~"}{print FNR,NR}' nowcoder.txt file.txt
1~~~1
2~~~2
3~~~3
4~~~4
5~~~5
1~~~6
2~~~7
3~~~8
4~~~9
5~~~10
6~~~11
7~~~12

4、FS(输入字段分隔符)

[root@2288H-V6 tmp]# #FS,输入字段分隔符
[root@2288H-V6 tmp]# awk 'BEGIN{FS="1"}{print "输出第一个字段:" $1}' nowcoder.txt
输出第一个字段:job salary
输出第一个字段:c++
输出第一个字段:java
输出第一个字段:php
输出第一个字段:python 34
[root@2288H-V6 tmp]# #等价于下列写法
[root@2288H-V6 tmp]# awk -F"1" '{print $1}' nowcoder.txt
job salary
c++
java
php
python 34

5、OFS(输出字段分隔符)

[root@2288H-V6 tmp]# awk 'BEGIN{OFS="---"}{print $1,$2}' nowcoder.txt
job---salary
c++---13
java---14
php---12
python---34

6、RS(输入行分隔符)

[root@2288H-V6 tmp]# cat nowcoder.txt
job salary
c++ 13
java 14
php 12
python 34
[root@2288H-V6 tmp]# awk '{RS=" "}{print $0}' nowcoder.txt
job salary
c++
13
java
14
php
12
python
34

[root@2288H-V6 tmp]#

7、ORS(输出行分隔符)

[root@2288H-V6 tmp]# awk '{ORS="---行分隔符---"}{print $0}' nowcoder.txt
job salary---行分隔符---c++ 13---行分隔符---java 14---行分隔符---php 12---行分隔符---python 34---行分隔符---[root@2288H-V6 tmp]#