引言
当我们揭开 Awk 功能部分时,我们将介绍 Awk 中内置变量的概念。您可以在 Awk 中使用两种类型的变量:用户定义的变量和内置变量。
内置变量的值已经在 Awk 中定义,但我们也可以仔细更改这些值,内置变量包括:
- FILENAME :当前输入文件名(不要更改变量名)
- FR :当前输入行号(即输入行1、2、3……以此类推,不要更改变量名)
- NF :当前输入行中的字段数(不要更改变量名称)
- OFS :输出字段分隔符
- FS :输入字段分隔符
- ORS:输出记录分隔符
- RS : 输入记录分隔符
实战
让我们继续说明上面一些 Awk 内置变量的使用:
要读取当前输入文件的文件名,可以使用 FILENAME 内置变量,如下所示:
awk ' { print FILENAME } ' ~/domains.txt
您将意识到,每个输入行都会打印出文件名,这是当您使用 FILENAME 内置变量时 Awk 的默认行为。
使用 NR 来计算输入文件中的行(记录)数,请记住,它还会计算空行,正如我们将在下面的示例中看到的那样。
当我们使用cat命令查看domains.txt文件时,它包含14行文本和2行空:
cat ~/domains.txt
awk ' END { print "Number of records in file is: ", NR } ' ~/domains.txt
要计算记录或行中的字段数,我们使用 NR 内置变量,如下所示:
cat ~/names.txt
awk '{ print "Record:",NR,"has",NF,"fields" ; }' ~/names.txt
接下来,您还可以使用 FS 内置变量指定输入字段分隔符,它定义 Awk 如何将输入行划分为字段。
FS 的默认值是空格和制表符,但我们可以将 FS 的值更改为任何字符,以指示 Awk 相应地划分输入行。
有两种方法可以做到这一点:
- 一种方法是使用 FS 内置变量
- 第二个是调用 -F Awk 选项
考虑Linux系统上的文件/etc/passwd,该文件中的字段使用:字符分隔,因此当我们想要过滤掉某些字段时,我们可以将其指定为新的输入字段分隔符,如下例所示:
我们可以使用 -F 选项,如下所示:
awk -F':' '{ print $1, $4 ;}' /etc/passwd
或者,我们还可以利用 FS 内置变量,如下所示:
awk ' BEGIN { FS=“:” ; } { print $1, $4 ; } ' /etc/passwd
要指定输出字段分隔符,请使用 OFS 内置变量,它定义如何使用我们使用的字符分隔输出字段,如下例所示:
awk -F':' ' BEGIN { OFS="==>" ;} { print $1, $4 ;}' /etc/passwd
在本文中,我们探讨了使用带有预定义值的 Awk 内置变量的想法。但是我们也可以更改这些值,不过,不建议这样做,除非您知道自己在做什么,并且有足够的理解。