网站搜索

了解如何使用 awk 内置变量 - 第 10 部分


当我们揭开 Awk 功能部分时,在本系列的这一部分中,我们将介绍 Awk 中内置变量的概念。您可以在 Awk 中使用两种类型的变量,它们是: 用户定义变量(我们在第 8 部分中介绍过)和内置变量。

内置变量的值已经在awk中定义,但我们也可以仔细更改这些值,内置变量包括:

  1. FILENAME :当前输入文件名(不要更改变量名)
  2. FR :当前输入行号(即输入行1、2、3…以此类推,不要更改变量名)
  3. NF :当前输入行中的字段数(不要更改变量名称)
  4. OFS :输出字段分隔符
  5. FS :输入字段分隔符
  6. ORS :输出记录分隔符
  7. 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 的默认值是 spacetab,但是我们可以将 FS 的值更改为任何符合条件的字符。将指示 Awk 相应地划分输入行。

有两种方法可以做到这一点:

  1. 一种方法是使用 FS 内置变量
  2. 第二个是调用 -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 保持联系。