1

我正在 ssh'ing 到一个机器列表并获取它们的所有系统信息(型号、硬件地址等)

我得到的信息很好,而且组织得井井有条,可以轻松地使用 awk 来获取我需要的信息。但是,不起作用的是 FNR 选择特定行:

entry=$(tssh -n 10 $host 'smbios-sys-info')
echo "$entry" | awk 'FNR == 2 {print $3 $4}'

如果我删除 FNR,单独使用 awk '{print $3 $4}' 就可以了,但会给我字段的所有行的第 3 和第 4 行,而不是我想要的一行。

如果我在 shell 中的脚本之外执行此操作,则可以:

smbios-sys-info | awk 'FNR == 2 {print $3 $4}'

我想可能有一些关于使用 echo "$entry"(引号中的变量)的潜在影响,这会以某种方式影响 awk 选择特定行的能力,即使 "$entry" 保留了 smbios-sys-info 的格式。

只是为了给您一个想法,这里是命令 smbios-sys-info 输出的内容:

[root@host ~]# smbios-sys-info
Libsmbios version:      2.2.26
Product Name:           OptiPlex 760
Vendor:                 Dell Inc.
BIOS Version:           A02
System ID:              123456
Service Tag:            ABCDEFG
Express Service Code:   11111111111
Asset Tag:              N/A
Property Ownership Tag: N/A

编辑我意识到另一种选择是我可以在 ssh 命令中使用 awk 来获取一个字段而不是所有字段。但这对我的情况没有好处,因为我需要对系统信息执行多项操作,因此更容易一次抓住整个事情,然后在本地使用它。

4

1 回答 1

2

FNR 当前输入文件中的输入记录号。

NR 到目前为止看到的输入记录总数。

在这里,使用我的 awk(Gnu awk 4.1.0),NR 和 FNR 都有效。但如果您没有文件作为输入,最好使用 NR。

@rici 问题在于,真正的老awk 并没有将FNR 实现为特殊变量。只有NR。

于 2013-07-05T15:12:21.670 回答