了解如何使用 awk 内置变量 - 第 10 部分
当我们揭开 Awk 功能部分时,在本系列的这一部分中,我们将介绍 Awk 中内置变量的概念。您可以在 Awk 中使用两种类型的变量,它们是: 用户定义变量(我们在第 8 部分中介绍过)和内置变量。
内置变量的值已经在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
的默认值是 space 和 tab,但是我们可以将 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
在本第 10 部分中,我们探索了使用带有预定义值的 Awk 内置变量的想法。但是我们也可以更改这些值,不过,不建议这样做,除非您知道自己在做什么,并且有足够的理解。
之后,我们将继续介绍如何在 Awk 命令操作中使用 shell 变量,因此,请与 Howtoing 保持联系。