按文件中的IP打印每个唯一行的最后一次出现

时间:2016-07-05 20:21:22

标签: bash awk

我需要解析一个日志文件,以便以下条目如下:

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来实现这一点?

2 个答案:

答案 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."