使用带有 awk 或 sed 的列拆分日志文件



我有一个日志文件,如下所示:

www.domainone.com FIX 3.3 12.12.123.1
www.domainone.com FIX 3.4 12.12.123.1
www.domainone.com FIX 2.4 12.12.123.1
www.domaintwo.com MAX 1.4 44.15.153.5
www.domaintwo.com MAX 3.2 44.15.153.5
www.domaintwo.com MAX 3.9 44.15.153.5
www.domaintwo.com MAX 12.4 44.15.153.5
www.domainthree.com NAN 3.4 34.45.144.7
www.domainthree.com NAN 2.4 34.45.144.7
www.domainthree.com NAN 3.2 34.45.144.7
www.domainthree.com NAN 3.3 34.45.144.7
www.domainthree.com NAN 1.4 34.45.144.7

我想运行一个 grep、awk、sed 或其他 bash 命令/脚本,它将按最后一列拆分该日志文件,因此结果是 3 个日志文件,这些文件使用 IP 命名,不带点。 因此,其中一个将是 34.45.144.7.log并且具有

www.domainthree.com NAN 3.4 34.45.144.7
www.domainthree.com NAN 2.4 34.45.144.7
www.domainthree.com NAN 3.2 34.45.144.7
www.domainthree.com NAN 3.3 34.45.144.7
www.domainthree.com NAN 1.4 34.45.144.7

我能够对它们进行排序并使用awk从原始日志中删除一些列,但不知道如何使用一列拆分为文件。

如果 IP 始终是第四列,则可以使用

awk '{ filename=$4".log"; if (prev && (filename != prev)) close(prev); print >>filename; prev=filename }' ips.log

或者根据@Ed莫顿的说法,甚至更好

awk '{ print >>($4".log"); close($4".log") }' ips.log

这会将整行打印到由第四列 (IP) + ".log"组成的文件中

这是在 Ubuntu 12.04 和 GNU awk 3.1.8 中。

因此,结果是使用 IP 命名的 3 个日志文件,其中没有 点

awk '{f=$4; gsub(/./,"",f);print > f".log"}' ips.log

应@OlafDietsche的要求:

awk '{ filename=$4".log"; if (filename != prev) close(prev); print >filename; prev=filename }' ips.log

没想到评论会拖那么久,否则我会立即这样做!

最新更新