如何比较文件中的两行?

如何比较文件中的两行?

假设我有一个文件foo.csv

timestamp,id,ip_src,ip_dst,protocol,msg    
08/20-12:01:22.172612 ,1000001,10.0.0.2,10.0.0.1,ICMP,"ICMP test detected"
08/20-12:03:22.172809 ,1000001,10.0.0.6,10.0.0.3,ICMP,"ICMP test detected"
08/20-12:06:22.172940 ,1000001,10.0.0.1,10.0.0.2,ICMP,"ICMP test detected"
08/20-12:06:22.172838 ,1000001,10.0.0.9,10.0.0.2,ICMP,"ICMP test detected"
08/20-12:10:23.173945 ,1000001,10.0.0.8,10.0.0.1,ICMP,"ICMP test detected"
08/20-12:19:23.173982 ,1000001,10.0.0.1,10.0.0.8,ICMP,"ICMP test detected"

我想知道如何ip_src从最后一行开始比较并检查其上方的行直到找到具有相同 IP 地址的行。

我可以这么做吗?

这是我的代码片段:

#!/bin/bash
logfile="/var/log/foo.csv"

tail -s 0 -n 1 -f $logfile | while read line; do
    time=`echo $line | cut -f 1 -d ","`
    id=`echo $line | cut -f 2 -d ","`
    src=`echo $line | cut -f 3 -d ","`
    dst=`echo $line | cut -f 4 -d ","`
...

答案1

我会翻转文件使用tac-然后你可以注意到第一的第三个逗号分隔的字段的值,并在再次看到它时打印:

$ tac "$logfile" | awk -F, 'NR==1 {seen[$3]++; next} seen[$3] {print; quit}'
08/20-12:06:22.172940 ,1000001,10.0.0.1,10.0.0.2,ICMP,"ICMP test detected"

答案2

另一个使用 awk 的方法:

awk -F, '{a[ip] = nr; nr = NR; ip = $3} END {print a[$3]}' foo.csv

这会将前一行的 IP 和行号保存到数组中a。处理完所有行后,最后一行的行号尚未更新 - 其位置仍由该 IP 最后一次出现的行号占用。

答案3

IIUC,像这样的事情可以完成这项工作:

#!/usr/bin/env sh

last_ip_address="$(tail -1 "$1"  | cut -d, -f3)"
echo Last IP address: "$last_ip_address"
last_line="$(cut -d, -f3 "$1"  | grep -n "$last_ip_address" | cut -d: -f1 | tail -2 | head -n 1)"
echo Last line that has it: "$last_line"

用法:

$./script.sh <FILE>

在您的示例中:

$ ./script.sh foo.csv
Last IP address: 10.0.0.1
Last line that has it: 4

答案4

仅使用 awk 尝试另一种解决方案。

awk '
{
  a[FNR]=$0
}
END{
split(a[FNR], array,",");
for(i=FNR;i>1;i--){
  split(a[i-1], array1,",");
  if(array[3] == array1[3]){
    print a[i-1];
}
}
}
' Input_file

这将查找上面所有具有与 Input_file 最后一行相同的第 3 个字段的行,因此如果您只想要最后一行第 3 个字段的第一个匹配,则在 print a[i-1] 后添加 exit 或 quit,请让我知道这是否对您有帮助。

相关内容