Позвольте говорят, что у меня есть файл 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 ","`
...
Я зеркально отразил бы файл вокруг использования 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"
Другой с awk:
awk -F, '{a[ip] = nr; nr = NR; ip = $3} END {print a[$3]}' foo.csv
Это сохраняет IP-адрес предыдущей строки и номер строки к массиву a
. После того, как все строки были обработаны, последний номер строки еще не был обновлен - это - слот, все еще занят номером строки последнего вхождения того IP.
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
попробуйте еще одно решение только 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
Это будет искать все строки, выше которых имеют то же 3-е поле как последняя строка Input_file, поэтому если Вы хотите только очень 1-е соответствие того 3-го поля последней строки, затем добавляют или выход или выходят после печати [i-1], сообщают мне, помогает ли это Вам.