Как сравнить две строки в файле?

Скажем, у меня есть файл 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 ","` ...
2
задан 22 August 2017 в 01:54

8 ответов

Другой с awk:

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

Сохраняет IP-адрес и номер строки предыдущей строки в массиве a. После того как все строки были обработаны, последний номер строки еще не обновлен - это слот все еще занят номером строки последнего вхождения этого IP.

2
ответ дан 18 July 2018 в 08:13

попробуйте еще одно решение только с 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, поэтому, если вы хотите только 1-го совпадения этого третьего поле последней строки добавьте либо выход, либо выйти после печати [i-1], сообщите мне, если это вам поможет.

0
ответ дан 18 July 2018 в 08:13

Я бы перевернул файл с помощью 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
ответ дан 18 July 2018 в 08:13

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
0
ответ дан 18 July 2018 в 08:13

Другой с awk:

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

Сохраняет IP-адрес и номер строки предыдущей строки в массиве a. После того как все строки были обработаны, последний номер строки еще не обновлен - это слот все еще занят номером строки последнего вхождения этого IP.

2
ответ дан 24 July 2018 в 19:02

попробуйте еще одно решение только с 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, поэтому, если вы хотите только 1-го совпадения этого третьего поле последней строки добавьте либо выход, либо выйти после печати [i-1], сообщите мне, если это вам поможет.

0
ответ дан 24 July 2018 в 19:02

Я бы перевернул файл с помощью 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
ответ дан 24 July 2018 в 19:02

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
0
ответ дан 24 July 2018 в 19:02

Другие вопросы по тегам:

Похожие вопросы: