tags: UNIQ Filtri_Linux


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 404

uniq 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 | uniq

Ottieni 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 -c

Risultato:

      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 -nr

Questo è 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