2013-09-08 15 views
29

Próbuję wyodrębnić adresy IP z mojego rejestru Apache, policzyć je i posortować.Sortowanie adresu IP uniq z dziennika Apache

Z jakiegoś powodu część sortująca jest okropna.

Oto polecenie: przyklad

cat access.* | awk '{ print $1 }' | sort | uniq -c | sort -n 

wyjściowa:

16789 65.X.X.X 
    19448 65.X.X.X 
    1995 138.X.X.X 
    2407 213.X.X.X 
    2728 213.X.X.X 
    5478 188.X.X.X 
    6496 176.X.X.X 
    11332 130.X.X.X 

Nie rozumiem, dlaczego te wartości nie są naprawdę sortowane. Próbowałem również usunąć spacje na początku linii (sed 's/^[\t ]*//g') i używając sort -n -t" " -k1, która niczego nie zmienia.

Dowolna podpowiedź?

Odpowiedz

64

To może być późno, ale za pomocą numerycznych w pierwszym rodzaju daje pożądanego rezultatu,

cat access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20 

wyjściowa:

29877 93.xxx.xxx.xxx 
    17538 80.xxx.xxx.xxx 
    5895 198.xxx.xxx.xxx 
    3042 37.xxx.xxx.xxx 
    2956 208.xxx.xxx.xxx 
    2613 94.xxx.xxx.xxx 
    2572 89.xxx.xxx.xxx 
    2268 94.xxx.xxx.xxx 
    1896 89.xxx.xxx.xxx 
    1584 46.xxx.xxx.xxx 
    1402 208.xxx.xxx.xxx 
    1273 93.xxx.xxx.xxx 
    1054 208.xxx.xxx.xxx 
    860 162.xxx.xxx.xxx 
    830 208.xxx.xxx.xxx 
    606 162.xxx.xxx.xxx 
    545 94.xxx.xxx.xxx 
    480 37.xxx.xxx.xxx 
    446 162.xxx.xxx.xxx 
    398 162.xxx.xxx.xxx 
+2

miałem zupełnie zapomniał to pytanie, ale udało mi się znaleźć rozwiązanie. To nie zadziałało (zobacz w moim pytaniu). Ale dodanie numeru liczbowego między numerem i adresem IP rozwiązało mój problem. – Arthur

+0

Downvote: ta odpowiedź nie zmienia absolutnie nic, faktyczna odpowiedź jest komentarzem Artura – nicolallias

+0

jak mogę tego użyć na ssl_request_log Apache, ponieważ wszystkie nasze zalewy są przez ssl – Hayden

2

To powinno działać

cat access.* | awk '{ print $1 }' | sort | awk '{print $1 " " $2;}' | sort -n 

nie widzę problemu.

Znaki kontrolne w plikach?

System plików pełny (pliki tymczasowe)?

4

nie wiem, dlaczego nie zrobił prosty sort -n nie działa, ale dodanie numeru nieliczbowego między kontem a adresem IP rozwiązało mój problem.

cat access.* | awk '{ print $1 } ' | sort | uniq -c | sed -r 's/^[ \t]*([0-9]+) (.*)$/\1 --- \2/' | sort -rn 
+1

To powinno być oznaczone jako zaakceptowana odpowiedź – nicolallias

+0

Czasami warto wykluczyć niektóre stany i boty 'cat access.log | grep -v -w 200 | grep -v -w 403 | grep -v -e '.jpg' | grep -v -i bot | awk "{print $ 1}" sort -n | uniq -c | sed -r 's/^ [\ t] * ([0-9] +) (. *) $/\ 1 --- \ 2 /' | sort -nr | głowa -200' – bato3

11

Dlaczego warto używać cat | awk? Trzeba tylko użyć awk:

awk '{ print $1 }' /var/log/*access*log | sort -n | uniq -c | sort -nr | head -20