如何选择具有最新日期和时间的行

如何选择具有最新日期和时间的行

我有一个文本文件(空格作为分隔符),如下所示:

Date           Time---------OtherFields-------Source IP   Destination IP 

2014-11-24  12:58:59.290                      1.2.3.4         5.6.7.8

2014-11-24  12:59:01.402                      1.2.3.8         5.6.7.8

2014-11-24  13:00:01.542                      12.14.25.1      5.6.7.8

2014-11-25  14:00:02.5                        12.14.25.2      5.6.7.8

2014-11-25  15:00:01.542                      12.14.25.1      6.7.8.9

2014-11-25  16:00:01.542                      12.14.25.5      6.7.8.9

对于目标 IP 5.6.7.8,我想选择具有最新日期和时间的行并将其保存在新的文本文件中以供进一步处理。同样的情况也适用于所有不同的目标 IP 地址。像这样的行有很多。

期望的输出应该是这样的。

2014-11-25  14:00:02.5                        12.14.25.2      5.6.7.8

2014-11-25  16:00:01.542                      12.14.25.5      6.7.8.9

我没有任何逻辑。任何帮助将不胜感激。谢谢

答案1

for dest in $(awk '{print $NF}' mylogfile | sort | uniq)
do
  grep ${dest} mylogfile | sort -k1 -k2 | tail -1
done


1    $(awk '{print $NF}' mylogfile | sort | uniq)

打印日志文件中每行的最后一个字段,这是您的目标 IP。对它进行排序,使相同的 IP 地址位于连续的块中。 uniq 只打印相同行块的一个实例

2 & 4   do ... done   

我认为这些都是不言自明的。一般循环结构

3    grep ${dest} mylogfile | sort -k1 -k2 | tail -1

查找具有一个 IP 地址的行(假设该 IP 地址在除最后一个字段之外的任何其他字段中均不重复),首先对字段 1 进行排序,然后对字段 2 进行排序,最新的日期/时间戳落入最后一行。tail -1抓住最后一行

答案2

您可以尝试以下操作awk

awk '{ x = $1" "$2; if (x > a[$4]) { a[$4] = x; b[$4] = $0; } } END { for (i in b) { print b[i]; } }' file

但由于它在内存中保存两个数组,因此对于非常大的文件可能不是很有用。

相关内容