/ / Conta ripetizioni ip nel log da bash - array, regex, bash, multidimensional-array

Conta ip repeat nel log da bash - array, regex, bash, array multidimensionale

bash come posso dire dalla ripetizione di un IP all'interno di un log tramite una ricerca specifica?

Per esempio:

#!/bin/bash

# Log line: [Sat Jul 04 21:55:35 2015] [error] [client 192.168.1.39] Access denied with status code 403.

grep "statusscodes403" /var/log/httpd/custom_error_log | while read line ; do

pattern="^[.*?]s[error]s[clients(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)].*?403"
[[ $line =~ $pattern ]]

res_remote_addr="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}.${BASH_REMATCH[4]}"

echo "Remote Addr: $res_remote_addr"

done

Ho bisogno di conoscere i risultati finali ottenuti un paio di volte ogni messaggio 403 ip, se possibile ordinare dal più alto al più basso.

Per output di esempio:

200.200.200.200 50 times.
200.200.200.201 40 times.
200.200.200.202 30 times.
... etc ...

Questo abbiamo bisogno di creare un report html da un registro mensile di apache in una serie di eventi (qualcosa come awstats).

risposte:

2 per risposta № 1

ci sono modi migliori. di seguito è la mia proposta, che dovrebbe essere più leggibile e più facile da mantenere:

grep -P -o "d{1,3}.d{1,3}.d{1,3}.d{1,3}" log_file | sort | uniq -c | sort -k1,1 -r -n

l'output dovrebbe essere in una forma di:

count1 ip1
count2 ip2

aggiornare:

filtro solo 403:

grep -P -o "d{1,3}.d{1,3}.d{1,3}.d{1,3}(?=.*403)" log_file | sort | uniq -c | sort -k1,1 -r -n

notare che uno sguardo al futuro sarebbe sufficiente.


0 per risposta № 2

Se il file di registro è nel formato menzionato in questione, la cosa migliore è usare awk per filtrare il codice di stato necessario e visualizzare solo l'IP. Quindi usa il uniq comando per contare ogni occorrenza:

awk "/code 403/ {print $8}" error.log | sort | uniq -c |sort -n

In awk, filtriamo in base all'espressione regolare /code 403/ quindi per le righe corrispondenti stampiamo l'ottavo valore (i valori sono separati da spazi bianchi), che è l'IP.

Quindi dobbiamo ordinare l'output, in modo che gli stessi IP siano uno dopo l'altro: questo è un requisito del uniq programma.

uniq -c stampa ogni riga univoca dall'input una sola volta - e preceduta dal numero di occorrenze. Infine ordiniamo questa lista numericamente per ottenere gli IP ordinati per conteggio.

Output di esempio (il primo è il numero di occorrenze, il secondo è IP):

1 1.1.1.1
10 2.2.2.2
12 3.3.3.3