Como comparar duas linhas em um arquivo?

2

Digamos que eu tenha um arquivo 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"

Eu quero como comparar ip_src da última linha e verificar a linha acima dela até encontrar uma linha que tenha o mesmo endereço IP.

Posso fazer isso?

Este é o meu snippet de código:

#!/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 ","'
...
    
por Rifqi 20.08.2017 / 14:52

4 respostas

2

Eu inverteria o arquivo usando tac - então você pode anotar o valor primeiro do terceiro campo separado por vírgula e imprimir quando vir de novo:

$ 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"
    
por steeldriver 20.08.2017 / 15:12
2

Outro com awk:

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

Isso salva o IP da linha anterior e o número da linha na matriz a . Depois de todas as linhas terem sido processadas, o último número da linha ainda não foi atualizado - seu espaço ainda é ocupado pelo número da última ocorrência desse IP.

    
por muru 22.08.2017 / 01:00
0

IIUC, algo assim faria o trabalho:

#!/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"

Uso:

$./script.sh <FILE>

No seu exemplo:

$ ./script.sh foo.csv
Last IP address: 10.0.0.1
Last line that has it: 4
    
por Arkadiusz Drabczyk 20.08.2017 / 15:19
0

tente mais uma solução com apenas 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

Isto irá procurar por todas as linhas acima que tenham o mesmo 3º campo da última linha de Input_file, então se você quiser apenas 1ª partida desse 3º campo da última linha então adicione exit ou quit depois de imprimir um [i-1] , deixe-me saber se isso ajuda você.

    
por RavinderSingh13 21.08.2017 / 21:59