#!/usr/bin/gawk -f # # # ipgrep / ... # # Grep ip-numbers in awk field from . # function ipval(str, i, n, x, val) { if ((n = split(str, x, ".")) != 4) return (0); val = x[1]; for (i=2; i<=4; i++) val = lshift(val, 8) + x[i]; return (val); } function ipmask(str, val) { if (index(str, ".") == 0) { str = str + 0; if (str < 0 || str > 32) str = 32; val = (str == 0)? 0: lshift(compl(0), 32 - str); } else { val = ipval(str); if (val == 0) val = compl(0); } return (val); } function ipstr(val, i, str) { str = sprintf ("%d", and(val, 255)); for (i=2; i<=4; i++) { val = rshift(val, 8); str = sprintf ("%d", and(val, 255)) "." str; } return (str); } BEGIN { STDERR = "/dev/stderr"; argi = 1; invert = 0; if (ARGV[argi] == "-i") { invert = 1; ARGV[argi++] = ""; } field = ARGV[argi]; ARGV[argi++] = ""; n = split(ARGV[argi], x, ","); ARGV[argi++] = ""; for (i=1; i<=n; i++) { iparg = x[i]; if (index(iparg, "/") == 0) iparg = iparg "/32"; k = index(iparg, "/"); ip = ipval(substr(iparg, 1, k-1)); mask = ipmask(substr(iparg, k+1)); first[i] = and(ip, mask); last[i] = or(ip, compl(mask)); } } /./ { if (split($field, x, ".") == 4) { ipnum = ipval($field); for (i=1; i<=n; i++) { if (first[i] <= ipnum && ipnum <= last[i]) { if (invert == 0) print $0; next; } } if (invert == 1) print $0; } }