我有一个文本文件(空格作为分隔符),如下所示:
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
但由于它在内存中保存两个数组,因此对于非常大的文件可能不是很有用。