【问题标题】:Parsing log file into multiple unique log files将日志文件解析为多个唯一的日志文件
【发布时间】:2015-06-07 23:48:12
【问题描述】:

我有一个集中式日志文件,我试图将其解析为多个文件,以使其更易于管理。

该文件包含如下所示的行

2015-04-02 16:03:13 -0500       192.168.3.3: shell login for 'rancid' from 192.168.50.10 on tty1 succeeded
2015-04-02 16:03:20 -0500       192.168.3.8: shell login for 'rancid' from 192.168.50.10 on tty1 succeeded
2015-04-02 16:03:24 -0500       192.168.4.11: shell login for 'rancid' from 192.168.50.10 on tty1 succeeded
2015-04-02 16:03:33 -0500       192.168.4.7: shell login for 'rancid' from 192.168.50.10 on tty1 succeeded
2015-04-02 16:03:34 -0500       192.168.4.8: shell login for 'rancid' from 192.168.50.10 on tty1 succeeded
2015-04-02 16:03:46 -0500       192.168.5.10: shell login for 'rancid' from 192.168.50.10 on tty1 succeeded
2015-04-02 16:03:50 -0500       192.168.5.11: shell login for 'rancid' from 192.168.50.10 on tty1 succeeded

我想将日志文件拆分出来,以便与第一个 IP 地址相关的所有行都在同一个日志文件中,这样 192.168.3.8 就有自己的文件,192.168.4.11 有自己的文件等

【问题讨论】:

  • 试一试,然后向我们展示您的尝试:)
  • 好吧,到目前为止我唯一能想到的就是在一个循环中针对一组 IP 地址运行 grep ......我想这会很好,但这是一个列表(数组)我d 必须跟上。除非我只能使用字符 33-46 数字进行通配符搜索,因为地址从每行的字符 33 开始,并让它使用该地址作为文件名
  • 如果你想用 shell 脚本来做,sedawk 是不错的选择。否则,你总是可以用 python 或其他语言在一个小程序中解析它(我就是这样做的,但这只是因为我不擅长 sed/awk...)。

标签: linux bash grep centos6 cat


【解决方案1】:

试试这个(但要注意你会得到一些文件ip_xxx.xxx.xxx.xxx.log :-)

LOG=logfile_to_be_splitted
awk '{print $4}' ${LOG} | sort -u | while read ip; do 
  lfile=$(echo "$ip" | sed 's/\(.*\):/ip_\1.log/'); 
  grep "$ip" "$LOG" >$lfile; 
done

awk 命令获取包含 IP 地址的列

sort -u 使它们唯一(如果 IP 地址不在连续行中)

sed第4列的IP地址去掉尾随的“:”

while 循环中,IP 从日志文件中提取到相应的文件中

【讨论】:

  • 我试图通过 cat access.log | 到达那里awk {'打印 $4'} |排序 | uniq 但这只是给了我第 4 个字段中的所有 IP 地址重复或否。我会试试你的方法,看看会发生什么......非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多