【发布时间】:2016-07-05 20:21:21
【问题描述】:
我需要解析一个日志文件,以便以下条目如下所示:
Jul 23 17:38:06 192.168.1.100 638 "this message will always be the same"
Jul 23 17:56:11 192.168.1.100 648 "this message will always be the same."
Jul 23 18:14:17 192.168.1.101 "this message will always be the same."
Jul 23 18:58:17 192.168.1.101 "this message will always be the same."
看起来像这样:
Jul 23 17:56:11 192.168.1.100 648 "this message will always be the same."
Jul 23 18:58:17 192.168.1.101 "this message will always be the same."
基本上我正在做的是获取一个具有重复 IP 地址但具有不同时间戳的文件,并找到每个 IP 地址的最后一次出现(或最近一次出现),并将其打印到屏幕上或将其定向到另一个文件。
我尝试过的:
我编写了一个 bash 脚本,我认为它可以让我这样做,但它不起作用。
#!/bin/bash
/bin/grep 'common pattern to all lines' /var/log/file | awk '{print $4}' | sort - u > /home/user/iplist
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line"
done < "/home/user/iplist"
awk '/'$line'/ {a=$0}END{print a} ' /var/log/logfile
脚本运行并输出每个 IP 地址,但除了最后一个之外,它不打印整行。
例如..
192.168.100.101
192.168.100.102
192.168.100.103
Jul 23 20:20:55 192.168.100.104 "this message will always be the same."
脚本中的第一个命令获取所有唯一出现的 IP 并将其发送到文件。 while 循环为每一行分配一个“$line”变量,然后将其传递给 awk,我认为它会获取每个 IP,然后搜索实际文件并打印出每个文件的最后一次出现。我怎样才能让它工作,无论是使用脚本还是使用 awk one liner?
【问题讨论】:
-
“查找每个 IP 地址的最后一次出现(或最近一次)” - 所以您需要最后一次出现,还是需要最近一次出现的时间?还是一样的,因为它们是按时间排序的?
-
另外,您需要按特定顺序打印它们,还是顺序任意?
-
它们应该是相同的——最后一次出现/最后一次出现。顺序是任意的。
-
不要使用 shell 循环来操作文本,这不是 shell 创建的目的,因此很难正确地做到这一点。见why-is-using-a-shell-loop-to-process-text-considered-bad-practice。