【问题标题】:print last occurrence of each unique line by IP in file在文件中按 IP 打印每个唯一行的最后一次出现
【发布时间】: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

标签: bash awk


【解决方案1】:
$ 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."

【讨论】:

    【解决方案2】:

    你可以使用这个 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."
    

    【讨论】:

    • 又是好点。这将使它也适用于非 gnu awk。
    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2015-03-06
    • 2012-10-14
    • 1970-01-01
    • 2023-01-22
    相关资源
    最近更新 更多