Lavoreremo sul seguente esempio di output:
10.10.14.5 GET /login 200
203.0.113.42 GET /admin 403
10.10.14.5 POST /login 200
198.51.100.7 GET /index.html 200
203.0.113.42 GET /admin 403
10.10.14.5 GET /dashboard 200
203.0.113.42 GET /.env 404
198.51.100.7 GET /index.html 200
203.0.113.42 GET /backup.zip 404
10.10.14.5 GET /dashboard 200
192.168.1.99 GET /index.html 200
203.0.113.42 GET /wp-admin 404
10.10.14.5 GET /api/users 200
203.0.113.42 GET /config.php 404
198.51.100.7 GET /contact 200
203.0.113.42 GET /shell.php 404
10.10.14.5 POST /api/users 201
203.0.113.42 GET /admin.php 404
192.168.1.99 GET /about 200
203.0.113.42 GET /phpmyadmin 404uniq collassa righe duplicate consecutive in una sola. La parola chiave è consecutive — ed è la trappola numero uno.
Guarda:
sort access.log | awk '{print $1}'Questo ti dà tutti gli IP ordinati. Ordinati significa che gli uguali finiscono vicini. Solo a quel punto uniq funziona:
awk '{print $1}' access.log | sort | uniqOttieni la lista degli IP unici:
10.10.14.5
192.168.1.99
198.51.100.7
203.0.113.42
La regola d’oro: uniq va quasi sempre preceduto da sort.
Se salti il sort, uniq vede solo i duplicati che erano già attaccati per caso e ti dà risultati sbagliati senza avvertirti!
Il flag che cambia tutto: uniq -c
-c = “count”. Conta quante volte appare ogni riga e mette il numero davanti:
bash
awk '{print $1}' access.log | sort | uniq -cRisultato:
6 10.10.14.5
2 192.168.1.99
3 198.51.100.7
9 203.0.113.42
Adesso vedi numericamente che 203.0.113.42 ha fatto 9 richieste, il triplo degli altri. Il sospetto di prima ora è un dato.
Se lo volessi ordinare dal più grande al più piccolo:
awk '{print $1}' access.log | sort | uniq -c | sort -nrQuesto è il coltello svizzero della recon. “Chi ha fatto più richieste”, “quale endpoint è più colpito”, “quale user-agent ricorre”, “quale porta compare di più” — è sempre questo pattern. Tienilo a mente come uno schema fisso: estrai colonna → sort → uniq -c → sort -nr.
Infatti lo puoi usare su qualsiasi colonna come nel seguente esempio:
awk {'print $3'} esempio.txt | sort | uniq -c | sort -nr
3 /index.html
2 /login
2 /dashboard
2 /api/users
2 /admin
1 /wp-admin
1 /shell.php
1 /phpmyadmin
1 /contact
1 /config.php
1 /backup.zip
1 /admin.php
1 /about
1 /.env