logfile auswerten - doppelte IPs filtern?

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
fulltilt
Beiträge: 1155
Registriert: 03.12.2006 20:10:57

logfile auswerten - doppelte IPs filtern?

Beitrag von fulltilt » 18.03.2018 10:32:39

grep | awk | uniq ???

Code: Alles auswählen

cat /var/log/kern.log | grep "IPTables: input-reject " | sort | uniq -c | wc -l
Ich möchte die Anzahl von blockierten IPs ausgeben und dabei sollen doppelte IP Adressen nur einmal gezählt werden, also wie unten im Log soll z.b. SRC=185.222.211.30 nur einmal gezählt werden.
Wie kann man das umsetzen?

Code: Alles auswählen

Mar 18 10:21:49 xxxx kernel: [2422357.516838] IPTables: input-reject IN=eth0 OUT= MAC=f8:b1:55:b0:4c:89:00:24:18:a5:92:00:08:00 SRC=185.222.211.30 DST=xx.xxx.xx.xxx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=57 ID=5739 DF PROTO=TCP SPT=21442 DPT=143 WINDOW=29200 RES=0x00 SYN URGP=0
Debian: Testing
Desktop: KDE Plasma 5

Benutzeravatar
fulltilt
Beiträge: 1155
Registriert: 03.12.2006 20:10:57

Re: logfile auswerten - doppelte IPs filtern?

Beitrag von fulltilt » 18.03.2018 11:58:59

ich meine so funktioniert es

Code: Alles auswählen

cat /var/log/kern.log | grep "IPTables: input-reject "| awk -F"SRC=" {'print $2'} | awk {'print $1'} | sort -u | wc -l
kann man das so lassen?
Debian: Testing
Desktop: KDE Plasma 5

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: logfile auswerten - doppelte IPs filtern?

Beitrag von breakthewall » 18.03.2018 15:18:04

So könnte man das umsetzen.

Code: Alles auswählen

pattern="[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"
grep "input-reject" /var/log/kern.log | grep -oE "SRC=$pattern" | uniq | wc -l

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: logfile auswerten - doppelte IPs filtern?

Beitrag von heisenberg » 22.03.2018 17:51:13

Nachdem ich mit Perl nicht gegen awk anstinken konnte, probiere ich es jetzt nochmal mit ruby ;-).

Code: Alles auswählen

ruby  -e 'puts ARGF.read.scan(/IPTables: input-reject.*SRC=([^ ]+)/).uniq' /var/log/kern.log
Dieser hier lädt auch nicht die ganze Datei auf einmal ins RAM:

Code: Alles auswählen

ruby  -e 'puts ARGF.each_line.map{ |l| l.scan(/IPTables: input-reject.*SRC=([^ ]+)/) }.uniq' /var/log/kern.log
EDIT
War leider nix. Auch der zweite braucht noch ziehmlich viel Speicher.

Das hier wäre der Speichersparer, weil er auch wie die obigen Lösungen zeilenorientiert arbeitet:

Code: Alles auswählen

ruby -n -e 'BEGIN {r={}}
                r[$1]=true if $_.scan(/IPTables: input-reject.*SRC=([^ ]+)/)
                END{puts r.keys.compact.join("\n")}' kern.log 
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Antworten