LINUX.ORG.RU

Помогите удалить строки из текста


0

1

Всем здасте) В общем задача такая, есть файл(формируется tcpdump) типа

12:04:30.779254 0:0:0:0:1:23 sap f0 > 0:0:0:0:1:20 sap ff I (s=0,r=1,P) len=58
			 fff0 0003 fffd 1237 0007 0001 fff8 a54a
			 488b 0003 0000 fff8 4001 acb1 0000 0000
			 0000 0000 0000 0000 0000 0000 0000 0000
			 0000 0000 0000 0000 0000 0000 0000
12:04:30.779609 0:0:0:0:1:20 sap f0 > 0:0:0:0:1:23 sap ff I (s=0,r=1,P) len=14
			 fff0 0003 fffc 1237 0107 0001 fff8 a150
			 4b86
12:05:00.027963 0:0:0:0:1:24 sap f0 > 0:0:0:0:1:20 sap ff I (s=0,r=0,C) len=58
			 fff0 0000 fffd 1240 0009 0000 000f 0003

			 0000 fff8 6e2e 7f8e 0000 0000 0000 0000
			 0000 0000 0000 0000 0000 0000 0000 0000
			 0000 0000 0000 0000 0000 0000 0000
12:05:00.028020 arp who-has 192.168.1.2 tell 192.168.1.1
			 0001 0800 0604 0001 0000 0000 0120 c0a8
			 0101 0000 0000 0000 c0a8 0102
12:05:00.028911 0:0:0:0:1:20 sap f0 > 0:0:0:0:1:24 sap ff I (s=0,r=0,C) len=20
			 fff0 0000 fffc 1240 0109 0000 000f 0003
			 0000 fff8 6737 8586
12:05:01.022417 arp who-has 192.168.1.2 tell 192.168.1.1
			 0001 0800 0604 0001 0000 0000 0120 c0a8
			 0101 0000 0000 0000 c0a8 0102
12:05:02.022416 arp who-has 192.168.1.2 tell 192.168.1.1
			 0001 0800 0604 0001 0000 0000 0120 c0a8
			 0101 0000 0000 0000 c0a8 0102
12:05:04.000033 0:0:0:0:1:20 sap f0 > 0:0:0:0:1:24 sap ff I (s=0,r=0,C) len=14
			 fff0 0000 fffb 1240 0020 0000 fff8 a4dd
			 48dc
12:05:04.002402 0:0:0:0:1:24 sap f0 > 0:0:0:0:1:20 sap ff I (s=0,r=0,C) len=58
			 fff0 0000 fffe 1240 0120 0000 fff8 a0cb
			 4beb fff8 6e2e 7f8e 0000 0000 0000 0000
			 0000 0000 0000 0000 0000 0000 0000 0000
			 0000 0000 0000 0000 0000 0000 0000

необходимо удалить из него пакеты у которых 3-й принятый байт в пакете = fffd

Помогите пожалуйста, как я понимаю надо пользоваться AWK, заранее благодарен!



Последнее исправление: nick9 (всего исправлений: 1)

А в строке лога, отображающей пакет с fffd байтом, всегда 5 строк? Если всегда, то можно простым перл скриптом

#!/usr/bin/perl

undef $/ ;

$file = <>;

while ($file =~ s/^.*\n\s+\S+\s+\S+\s+fffd.*\n.*\n.*\n.*\n//gm) {
}

print $file;
запуск
./no_fffd.pl < dump.txt

codeogre
()

perl -ne 'if(m#^[^\s]#){if(@a&&(split"\\s+",$a[1])[3]ne"fffd"){print @a}@a=($_)}else{push@a,$_}END{if((split"\\s+",$a[1])[3]ne"fffd"){print @a}}'

arto ★★
()
Ответ на: комментарий от nick9

а в чём именно проблема?

# perltidy
if(m#^[^\s]#){if(@a&&(split"\\s+",$a[1])[3]ne"fffd"){print @a}@a=($_)}else{push@a,$_}END{if((split"\\s+",$a[1])[3]ne"fffd"){print @a}}
^D
if (m#^[^\s]#) {
    if ( @a && ( split "\\s+", $a[1] )[3] ne "fffd" ) { print @a }
    @a = ($_);
}
else { push @a, $_ }

END {
    if ( ( split "\\s+", $a[1] )[3] ne "fffd" ) { print @a }
}
arto ★★
()
Ответ на: комментарий от nick9

А как-то попроще нельзя?

awk '/^[^\t]/ { tmp = $0; getline; drop = ($3 == "fffd"); $0 = tmp "\n" $0 } drop == 1 { next } 1' tcpdump.log

p.s. И, да, если я правильно понял условие, fffd это не третий байт, а два байта: пятый и шестой ;)

unterwulf
()
Ответ на: комментарий от nick9

perl -0777 -ne 'foreach(grep{(split"\\s+",(split"\n")[1])[3]ne"fffd"}split"\n(?!\\s)",$_) {print$_,«\n»}'

но будет сразу читать всё в память.

arto ★★
()

:-) а вообще это надо делать tcpdump-ом. см `man pcap-filter` по поводу выборки и тестирования конкретных байт

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.