Извлечение информации о трассировке с помощью gawk

Я новичок в программировании awk и использую gawk для извлечения информации о трассировке из файла mrt, чтобы использовать его для анализа. Я успешно смог извлечь информацию трассировки из формата файла pcap, но не могу понять это для формата mrt. Позвольте мне объяснить, что я пытаюсь извлечь, показывая вам пример формата pcap.

Мой входной файл pcap:

No. Time Source Destination Protocol Length User Datagram Protocol Info 1 0.000000 2001:4958:10:2::2 2001:4958:10:2::3 BGP 143 UPDATE Message Frame 1: 143 bytes on wire (1144 bits), 143 bytes captured (1144 bits) Ethernet II, Src: JuniperN_36:98:52 (5c:5e:ab:36:98:52), Dst: JuniperN_3e:bf:49 (78:19:f7:3e:bf:49) Internet Protocol Version 6, Src: 2001:4958:10:2::2 (2001:4958:10:2::2), Dst: 2001:4958:10:2::3 (2001:4958:10:2::3) Transmission Control Protocol, Src Port: bgp (179), Dst Port: 56797 (56797), Seq: 1, Ack: 1, Len: 37 Border Gateway Protocol No. Time Source Destination Protocol Length User Datagram Protocol Info 2 0.326625 2001:4958:10:2::2 2001:4958:10:2::3 BGP 184 UPDATE Message Frame 2: 184 bytes on wire (1472 bits), 184 bytes captured (1472 bits) Ethernet II, Src: JuniperN_36:98:52 (5c:5e:ab:36:98:52), Dst: JuniperN_3e:bf:49 (78:19:f7:3e:bf:49) Internet Protocol Version 6, Src: 2001:4958:10:2::2 (2001:4958:10:2::2), Dst: 2001:4958:10:2::3 (2001:4958:10:2::3) Transmission Control Protocol, Src Port: bgp (179), Dst Port: 56797 (56797), Seq: 38, Ack: 1, Len: 78 Border Gateway Protocol No. Time Source Destination Protocol Length User Datagram Protocol Info 3 1.178114 2001:4958:10:2::2 2001:4958:10:2::3 TCP 106 bgp > 56797 [ACK] Seq=116 Ack=20 Win=16384 Len=0 TSval=3269200636 TSecr=371929488 Frame 3: 106 bytes on wire (848 bits), 106 bytes captured (848 bits) Ethernet II, Src: JuniperN_36:98:52 (5c:5e:ab:36:98:52), Dst: JuniperN_3e:bf:49 (78:19:f7:3e:bf:49) Internet Protocol Version 6, Src: 2001:4958:10:2::2 (2001:4958:10:2::2), Dst: 2001:4958:10:2::3 (2001:4958:10:2::3) Transmission Control Protocol, Src Port: bgp (179), Dst Port: 56797 (56797), Seq: 116, Ack: 20, Len: 0 No. Time Source Destination Protocol Length User Datagram Protocol Info 4 2.410144 64.251.87.209 64.251.87.210 BGP 228 UPDATE Message, UPDATE Message Frame 4: 228 bytes on wire (1824 bits), 228 bytes captured (1824 bits) Ethernet II, Src: Cisco_e7:a1:c0 (00:1b:0d:e7:a1:c0), Dst: JuniperN_3e:ba:bd (78:19:f7:3e:ba:bd) Internet Protocol Version 4, Src: 64.251.87.209 (64.251.87.209), Dst: 64.251.87.210 (64.251.87.210) Transmission Control Protocol, Src Port: bgp (179), Dst Port: 65502 (65502), Seq: 1, Ack: 1, Len: 154 Border Gateway Protocol Border Gateway Protocol No. Time Source Destination Protocol Length User Datagram Protocol Info 5 3.467853 206.47.102.206 206.47.102.201 BGP 105 KEEPALIVE Message Frame 5: 105 bytes on wire (840 bits), 105 bytes captured (840 bits) Ethernet II, Src: JuniperN_36:98:52 (5c:5e:ab:36:98:52), Dst: JuniperN_3e:bf:49 (78:19:f7:3e:bf:49) Internet Protocol Version 4, Src: 206.47.102.206 (206.47.102.206), Dst: 206.47.102.201 (206.47.102.201) Transmission Control Protocol, Src Port: bgp (179), Dst Port: 55700 (55700), Seq: 1, Ack: 1, Len: 19 Border Gateway Protocol 

Я хотел извлечь из файла следующие поля:

  • Время
  • Источник
  • Место назначения
  • протокол
  • Длина пользовательской дейтаграммы

Я создал простой скрипт:

 { if($1 ~ /[0-9]/) { print $2,$3,$4,$5,$6 } } 

И запустил его на входной трассе для получения (gawk -f script.txt input-pcap.txt >> pcap-out.txt), как показано ниже:

 0.000000 2001:4958:10:2::2 2001:4958:10:2::3 BGP 143 0.326625 2001:4958:10:2::2 2001:4958:10:2::3 BGP 184 1.178114 2001:4958:10:2::2 2001:4958:10:2::3 TCP 106 2.410144 64.251.87.209 64.251.87.210 BGP 228 3.467853 206.47.102.206 206.47.102.201 BGP 105 

Теперь я хочу сделать то же самое для формата ввода mrt. Входной файл выглядит так:

 TIME: 11/01/07 00:11:09 TYPE: TABLE_DUMP/INET VIEW: 0 SEQUENCE: 0 PREFIX: 0.0.0.0/0 FROM:96.4.0.55 AS11686 ORIGINATED: 10/24/07 06:26:23 ORIGIN: IGP ASPATH: 11686 3561 NEXT_HOP: 96.4.0.55 STATUS: 0x1 TIME: 11/01/07 00:11:09TYPE: TABLE_DUMP/INETVIEW: 0SEQUENCE: 1PREFIX: 0.0.0.0/0 FROM:213.140.32.148 AS12956 ORIGINATED: 10/24/07 06:26:16 ORIGIN: IGP ASPATH: 12956 NEXT_HOP: 213.140.32.148 STATUS:0x1 TIME: 11/01/07 00:11:09 TYPE: TABLE_DUMP/INET VIEW: 0 SEQUENCE: 2 PREFIX: 3.0.0.0/8 FROM:207.45.223.244 AS6453 ORIGINATED: 10/31/07 07:37:39 ORIGIN: IGP ASPATH: 6453 701 703 80 NEXT_HOP: 207.45.223.244 STATUS: 0x1 TIME: 11/01/07 00:11:09 TYPE: TABLE_DUMP/INET VIEW: 0 SEQUENCE: 3 PREFIX: 3.0.0.0/8 FROM:195.219.96.239 AS6453 ORIGINATED: 10/31/07 07:49:07 ORIGIN: IGP ASPATH: 6453 701 703 80 NEXT_HOP: 195.219.96.239 STATUS: 0x1 TIME: 11/01/07 00:11:09 TYPE: TABLE_DUMP/INET VIEW: 0 SEQUENCE: 4 PREFIX: 3.0.0.0/8 FROM:129.250.0.11 AS2914 ORIGINATED: 10/31/07 06:09:07 ORIGIN: IGP ASPATH: 2914 701 703 80 NEXT_HOP: 129.250.0.11 MULTI_EXIT_DISC: 6 COMMUNITY: 2914:420 2914:2000 2914:3000 65504:701 STATUS: 0x1 

Я хочу извлечь следующую информацию в том же стиле, что и в формате pcap, чтобы ее можно было прочитать программным обеспечением для анализа:

  • Время (разница с полем времени первого пакета в секундах)
  • Из (6-го поля требуется только IP-адрес)
  • Next_hop (10-е поле)
  • Протокол / Происхождение (8-е поле)

Чтобы результат выглядел так:

 0.0000 96.4.0.55 96.4.0.55 IGP 0.0000 213.140.32.148 213.140.32.148 IGP 0.0000 207.45.223.244 207.45.223.244 IGP 0.0000 195.219.96.239 195.219.96.239 IGP 

И так далее…

Я попробовал пару скриптов, но не добился успеха. Пожалуйста, порекомендуйте. Благодаря!

  • Почему файл rc.status устанавливает локаль LC_ALL
  • Unix bash / ksh: выбор первого непространственного символа из файла из определенной строки
  • Экспортирование переменной с точкой (.) В ней
  • В чем разница между '* .txt' и * .txt?
  • Вывод строки в нижнем правом углу терминала
  • Завершить каждый фоновый процесс
  • Как обрабатывать ключи в сценарии оболочки?
  • Условно убивая процесс, основанный на его выходе
  • One Solution collect form web for “Извлечение информации о трассировке с помощью gawk”

    Несколько вещей, чтобы рассмотреть следующий скрипт gawk :

    • Увидев, что ваша дата ввода не показывает столетие, вы должны учитывать этот формат в реальности, до какой date умолчанию.

    • Приведенный образец вывода показывает десятичное время, но в вашем описании указаны секунды. Данные находятся в разрешении секунд, поэтому этот скрипт выводит целые секунды


     gawk 'function d2s( date ){ c="date -d\""date"\" +%s"; c|getline b; close(c); return gensub("\n","","",b) } BEGIN{ RS="\n *\n" } { nf=split($0,f,"\n"); delete o for(fi=1;fi<=nf;fi++){ split(f[fi],s," ") if( s[1]=="TIME:" ) o[1]=s[2]" "s[3] if( s[1]=="FROM:" ) o[2]=s[2] if( s[1]=="NEXT_HOP:" ) o[3]=s[2] if( s[1]=="ORIGIN:" ) o[4]=s[2] } if( o[1] ){ if( fps ) tds=d2s(o[1])-fps else { tds=0; fps=d2s(o[1]) } printf( "%s %s %s %s\n", tds, o[2], o[3], o[4] ) } }' "$f" 

    выход – со временем ввода, измененным от опубликованных (все они были одинаковыми):

     0 96.4.0.55 96.4.0.55 IGP 1 213.140.32.148 213.140.32.148 IGP 3 207.45.223.244 207.45.223.244 IGP 7 195.219.96.239 195.219.96.239 IGP 15 129.250.0.11 129.250.0.11 IGP 
    Linux и Unix - лучшая ОС в мире.