2012-04-15 2 views
0

У меня есть огромный журналы, как:быстрый способ разобрать журнал, чтобы найти каждый пользователь всех источники IPs

Apr 15 06:24:52 11.250.30.X:53516 [15/Apr/2012:06:24:51.504] userA 200 "GET HTTP/1.1" 
Apr 15 06:24:52 11.250.30.X:53516 [15/Apr/2012:06:24:51.504] userA 200 "GET HTTP/1.1" 
Apr 15 06:24:52 11.250.30.X:53516 [15/Apr/2012:06:24:51.504] userB 200 "GET HTTP/1.1" 
Apr 15 06:24:52 11.250.30.X:53516 [15/Apr/2012:06:24:51.504] userC 200 "GET HTTP/1.1" 
Apr 15 06:24:52 11.250.30.X:53516 [15/Apr/2012:06:24:51.504] userC 200 "GET HTTP/1.1" 
Apr 15 06:24:52 11.250.30.X:53516 [15/Apr/2012:06:24:51.504] userD 200 "GET HTTP/1.1" 

который является самым быстрым способом в Bash оболочке для синтаксического анализа журнала, чтобы из типа (каждый пользователь по всему запросу соуса IP-адреса):

userA: 
XXX.XXX.XXX.XXX(client's source IP, remove port number and uniq same IPs.) 
XXX.XXX.XXX.XXX 
... 
userB: 
XXX.XXX.XXX.XXX 
XXX.XXX.XXX.XXX 
XXX.XXX.XXX.XXX 
... 
userC: 
... 
+0

Я три- ed глупый и медленный метод, он без навыков. – timy

ответ

3

Использование AWK:

awk ' 
{ a[$6] = $4 "\n" a[$6] }          
END { 
    for (u in a) print u ":\n" a[u] 
}' FILE 

Для удаления портов и Uniq хозяева стараются это (я не проверял это хорошо):

awk ' 
{ 
    sub(":.*$", "", $4) 
    if (!a[$6,$4]) a[$6,$4]++ 
} 
END { 
    for (u in a) { 
     split(u, b, SUBSEP) 
     nu[b[1]] = b[2] "\n" nu[b[1]] 
    } 
    for (u in nu) print u ":\n" nu[u] 
}' FILE 
+0

Прохладный метод. Другой связанный вопрос, в awk здесь, как удалить IP-порт, например 11.250.30.X: 53516 -> 11.250.30.X, и uniq те же IP-адреса? Благодарю. – timy

+0

Добавлен ответ. – yazu

+0

Настолько блестящий! Благодарю. – timy

0

Это может быть полезно; он получает необходимые данные (список пользователей/IP пар отсортированных пользователем) в форме, пригодной для дальнейшей автоматической обработки:

awk '{split($4,a,":"); print $6, a[1]; }' | sort -u 
0

Баш решение:

declare -A ips=() 
while read x x x ip x user rest; do 
    ips[$user ${ip%:*}\\n]=1     # hash user+ip+newline 
done < "$infile" 

userold='' 
while read user ip; do      # split user, ip 
    [ "$userold" != "$user" ] && echo "$user" && userold="$user" 
    echo "$ip" 
done < <(echo -e "${!ips[*]}" | sort)  # feed sorted keys 

вход:

Apr 15 06:24:52 11.250.30.1:53516 [15/Apr/2012:06:24:51.504] userA 200 "GET HTTP/1.1" 
Apr 15 06:24:54 11.250.30.2:53516 [15/Apr/2012:06:24:51.504] userA 200 "GET HTTP/1.1" 
Apr 15 06:24:55 11.250.30.3:53516 [15/Apr/2012:06:24:51.504] userB 200 "GET HTTP/1.1" 
Apr 15 06:24:51 11.250.30.4:53516 [15/Apr /2012:06:24:51.504] userC 200 "GET HTTP/1.1" 
Apr 15 06:24:52 11.250.30.4:53516 [15/Apr/2012:06:24:51.504] userC 200 "GET HTTP/1.1" 
Apr 15 06:24:58 11.250.30.5:53516 [15/Apr/2012:06:24:51.504] userD 200 "GET HTTP/1.1" 

выход сортируется:

userA 
11.250.30.1 
11.250.30.2 
userB 
11.250.30.3 
userC 
11.250.30.4 
userD 
11.250.30.5