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

时间:2012-11-28 14:36:09

标签: bash logging 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命令/脚本,将最后一列拆分该日志文件,因此结果是使用没有点的IP命名的3个日志文件。所以,其中一个是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从原始日志中删除一些列,但不知道如何使用一列拆分成文件。

3 个答案:

答案 0 :(得分:3)

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

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

或根据@Ed Morton,甚至更好

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

这会将整行打印到由第四列(IP)+“。log”

组成的文件中

这是使用Ubuntu 12.04和GNU awk 3.1.8。

答案 1 :(得分:1)

  

所以结果是3个日志文件使用IP 命名而没有   点

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

答案 2 :(得分:1)

@ OlafDietsche的要求:

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

没想到这些评论拖延了很长时间,或者我已经做到了这一点!