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
3番目の(3rd)フィールドに対応するフィールド変数です。入力例では、IPv4アドレスのように見える文字列を含む3番目の列になります。式でip[$3]++
あれば増加$3
します。サンプル入力では合計2倍なので2倍に増加します。初期化されていないすべてのawk変数と同様に、最初から始まるので、最終値はです。"202.188.3.2"
ip["202.188.3.2"]
$3
"202.188.3.2"
ip["202.188.3.2"]
0
2
最初の例ではを使用しますfor (var in ip)
。これは、不明なキーを持つ配列を繰り返す正しい方法です。 2番目の例ではfor (var = 0; var <= NR; var++)
。ip
IPv4 アドレスのように見える文字列、いいえ整数インデックス。ip[0]
、、...要素は割り当てられていないため存在しません(、、、...が割り当てられip[1]
ていないため)。したがって、空の出力()が表示されます。$3
0
1
2
""
* ではawk
整数配列インデックスが実際に最初に文字列に変換されるので、 とa[1]
はa["1"]
同じ要素です。