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
합니다 . 샘플 입력에서는 총 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)
. 이는 알 수 없는 키가 있는 배열을 반복하는 올바른 방법입니다. 두 번째 예 에서는 for (var = 0; var <= NR; var++)
.ip
IPv4 주소처럼 보이는 문자열,아니요정수 인덱스. ip[0]
, , ... 요소 는 할당되지 않았기 때문에 존재하지 않습니다( , , ... ip[1]
이 할당되지 않았기 때문에 ). 따라서 빈 출력( )이 표시됩니다.$3
0
1
2
""
* 에서는 awk
정수 배열 인덱스가 실제로 먼저 문자열로 변환되므로 a[1]
및 a["1"]
는 동일한 요소입니다.