#!/usr/bin/python import sys, re from netaddr import IPAddress if len(sys.argv) != 2: print >>sys.stderr, "Usage: %s filename" % sys.argv[0] sys.exit(1) log = open(sys.argv[1], "a") # group 1 must be the prefix, group 2 the IP, group 3 the suffix ipmatch = r"([0-9a-f.:]+)" accesslog = re.compile(r"^(\S+ )"+ipmatch+r"( .*)$") errorlog = re.compile(r"^(.* \[client )"+ipmatch+r"(\] .*)$") while True: line = sys.stdin.readline() if not line: break # process this line match = accesslog.search(line) if match is None: match = errorlog.search(line) # check what we got if match is None: # unknown line log.write(line) else: prefix = match.group(1) ip = match.group(2) suffix = match.group(3) try: ip = IPAddress(ip) # parse the addres ip = ip & (IPAddress('255.255.255.0') if ip.version == 4 else IPAddress('ffff:ffff:ffff::')) # mask out a bunch of bits # now we have a parsed representation of the IP address we want to print log.write(prefix+str(ip)+suffix+"\n") except (ValueError, netaddr.core.AddrFormatError): # not actually an IP address... log.write(line) log.flush()