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]++
,如果$3
is "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"]
是相同的元素。