我需要解析一个日志文件,以便以下条目如下:
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地址的最后一次出现(或最近的时间),并将其打印到屏幕或将其指向另一个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循环分配一个&#34; $ line&#34;变量到每一行,然后传递给awk,我认为每个IP将获取每个IP然后搜索实际文件并打印出每个行的最后一次出现。如何使用脚本或者awk one liner来实现这一点?
答案 0 :(得分:4)
$ tac file | awk '!seen[$4]++' | tac
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."
答案 1 :(得分:1)
您可以使用此awk命令:
awk 'NF{a[$4]=$0} NF && !seen[$4]++{ips[++numIps]=$4} END {
for (i=1;i<=numIps;i++) print a[ips[i]] }' file
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."