关联数组如何工作?

关联数组如何工作?
bash-3.00# cat iplogs.txt
180607 093423   123.12.23.122  133
180607 121234   125.25.45.221  153
190607 084849   202.178.23.4   44
190607 084859   164.78.22.64   12
200607 012312   202.188.3.2    13
210607 084849   202.178.23.4   34
210607 121435   202.178.23.4   32
210607 132423   202.188.3.2    167

bash-3.00# awk '{ip[$3]++;} END{for (var in ip)\
print var, "access", ip[var]," times"}' iplogs.txt
202.188.3.2 access 2  times
164.78.22.64 access 1  times
202.178.23.4 access 3  times
125.25.45.221 access 1  times
123.12.23.122 access 1  time

上面的输出我不清楚。每个重复值如何$3递增?

我预计分配给数组的值ip将类似于:

ip[123.12.23.122]=0
ip[125.25.45.221]=1

等等。

所以我尝试了这个,但是数组的值ip[var]没有被打印。

bash-3.00# awk '{ip[$3]++;} END{for (var=0;var <= NR; var++)\
print var, ip[var]}' iplogs.txt
0
1
2
3
4
5
6
7
8

答案1

关联数组使用字符串作为键,而不是整数索引。* 本例中的键是$3,它是awk对应于第三个 (3rd) 字段的字段变量。在示例输入中,这将是第三列,其中包含看起来像 IPv4 地址的字符串。在表达式 中ip[$3]++,如果$3is "202.188.3.2",则ip["202.188.3.2"]递增。由于$3"202.188.3.2"样本输入中的总共两次,因此ip["202.188.3.2"]会增加两次。由于它0像所有未初始化的 awk 变量一样从一开始就开始,所以它最终的值为2.

您的第一个示例使用for (var in ip).这是迭代具有未知键的数组的正确方法。您的第二个示例使用for (var = 0; var <= NR; var++).然而,正如我上面所说,它ip被创建为一个关联数组,其键是看起来像 IPv4 地址的字符串,不是整数索引。元素ip[0], ip[1], ... 不存在,因为它们从未分配给(因为从来没有分配过$3, 0, 1... 2),这就是为什么您得到空输出 ( "")。


* 在 中awk,整数数组索引实际上首先转换为字符串,因此a[1]a["1"]是相同的元素。

相关内容