Проблема с написанием AWK скрипта

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
cromarty
проходил мимо
Сообщения: 3
Зарегистрирован: 2011-07-31 18:11:25

Проблема с написанием AWK скрипта

Непрочитанное сообщение cromarty » 2011-07-31 19:08:28

Собственно какая проблема, у меня есть лог пакетного обмена между сервером и клиентом, он находится в тхт файле и имеет вот такой вид:

Код: Выделить всё

+---------+---------------+----------+
10:42:29,460,437   ETHER
|0   |ff|ff|ff|ff|ff|ff|00|26|18|f2|0d|36|08|00|45|00|00|50|06|49|00|00|80|11|b1|c9|c0|a8|00|3b|c0|a8|00|ff|18|9d|17|d5|00|3c|1d|a4|4f|4b|2e|2e|2e|2e|20|53|45|52|56|45|52|20|4c|4f|41|44|45|44|21|28|41|54|43|20|73|65|72|76|65|72|73|28|52|44|50|26|46|44|50|29|20|56|65|72|20|39|2e|34|31|29|

+---------+---------------+----------+
10:44:03,147,937   ETHER
|0   |ff|ff|ff|ff|ff|ff|00|26|18|f2|0d|36|08|00|45|00|00|59|06|81|00|00|80|11|b1|88|c0|a8|00|3b|c0|a8|00|ff|18|9d|17|d5|00|45|d4|2b|53|45|54|53|43|54|20|2a|2a|2a|20|20|4f|44|53|2c|53|4f|55|2c|20|4d|4f|57|2c|4e|54|48|2c|20|4c|49|56|2c|43|45|4e|2c|20|54|43|31|2c|54|43|33|2c|54|43|32|2c|20|54|43|35|2c|20|54|43|34|2c|
В данном случае у меня UDP пакеты, и для скрипта, я написал расшифровку, что за чем идет.

Код: Выделить всё


1)      |0   | бит 1 - преамбула фрема
2)      |ff|ff|ff|ff|ff|ff| с 2 по 7 бит - MAC адрес получателя
3)      |00|26|18|f2|0d|36| с 8 по 13 бит - MAC адрес отправителя
4)      |08|00| с 14 по 15 бит - тип езернета, IPv4
5)      |45| 16 бит – длина заголовка
6)      |00| 17 бит - ECN-Capable Transport not set
7)      |00|50| 18-19 бит TotalLength: 80
8)      |06|49| 20-21 бит Identification: 1609
9)      |00|00| 22-23 бит FragmentFlags
10)  |80| 24 бит время жизни пакета
11)  |11| 25 бит – идентификатор протокола ЮДП
12)  |b1|c9| 26-27 бит – хешсумма
13)  |c0|a8|00|3b| 28-31бит -  IP адрес отправителя
14)  |c0|a8|00|ff| 32-35 бит -  IP адрес получателя
15)  |18|9d| 36-37 бит – порт отправителя
16)  |17|d5| 38-39 бит – порт получателя
17)  |00|3c| 40-41 бит – общая длина
18)  |00|3c| 42-43 бит - хеш сумма по портам.
19)|1d|a4|4f|4b|2e|2e|2e|2e|20|53|45|52|56|45|52|20|4c|4f|41|44|45|44|21|28|41|54|43|20|73|65|72|76|65|72|73|28|52|44|50|26|46|44|50|29|20|56|65|72|20|39|2e|34|31|29| 44-97 бит данные
 
Мне нужно из заголовка пакета вычленить время, общию длину, IP вход/исход и содержимое каждого пакета. Вот мой код, который получился (сразу говорю, что никогда не писал AWK скрипты, так что если что не красиво, прошу прощения:)

Код: Выделить всё

BEGIN{
FS = "|";
CURRENT_FIELD = 1;
}
!/^+/ && NF > 0 {
if(/^[0-9]/) {
CURRENT_FIELD = 1;
ParseTime001();                         
  }
  else {
  CURRENT_FIELD = 1;
  ParsePreamble010();
  ParseMACSrc020();
  ParseMACDest030();
  ParseEtherType040();
  ParseHeadLength050();
  ParseECNCapableTransport060();
  ParseTotalLength070();
  ParseIdentification080();
  ParseFragmentFlags090();
  ParsePackLifeTime100();
  ParseProtocolID110();
  ParseHashSum120();
  ParseIPSrc130();
  ParseIPDest140();
  ParsePortSrc150();
  ParsePortDest160();
  ParseOverallLength170();
  ParsePortHash180();
  ParseData190();
  }
}
function ParseTime001()
{
TIME[1] = 0;
TIME[2] = 0;
TIME[3] = 0;
  {
    TIME[1] = substr($CURRENT_FIELD,1,2)
    TIME[2] = substr($CURRENT_FIELD,4,2)
    TIME[3] = substr($CURRENT_FIELD,7,2)
  }
  DATE_TIME = sprintf("%02d:%02d:%02d",TIME[1],TIME[2],TIME[3]);
  printf("Time: %02d:%02d:%02d ",TIME[1],TIME[2],TIME[3]);
}
function ParsePreamble010()
{
  CURRENT_FIELD += 1;
}
function ParseMACSrc020()
{
CURRENT_FIELD +=6;
}
function ParseMACDest030()
{
CURRENT_FIELD +=6;
}
function ParseEtherType040()
{
CURRENT_FIELD +=2;
}
function ParseHeadLength050()
{
CURRENT_FIELD +=1;
}
function ParseECNCapableTransport060()
{
CURRENT_FIELD +=1;
}
function ParseTotalLength070()
{
	ParseTotalLength[1] = 0;
	ParseTotalLength[2] = 0;
	ParseTotalLength[2] = 0;
	{
	CURRENT_FIELD += 1;
		ParseTotalLength[1] = $CURRENT_FIELD
	CURRENT_FIELD += 1;
		ParseTotalLength[2] = $CURRENT_FIELD
	#ParseTotalLength[1] + ParseTotalLength[2];
	}
sprintf("%02c:%02c",ParseTotalLength[1], ParseTotalLength[2]);
printf("TotalLength: %02d:%02d " ,ParseTotalLength[1], ParseTotalLength[2]);
}
function ParseIdentification080()
{
CURRENT_FIELD +=2;
}
function ParseFragmentFlags090()
{
CURRENT_FIELD +=2;
}
function ParsePackLifeTime100()
{
CURRENT_FIELD +=1;
}
function ParseProtocolID110()
{
CURRENT_FIELD +=1;
}
function ParseHashSum120()
{
CURRENT_FIELD +=2;
}
function ParseIPSrc130()
{
	IPSrc130[1] = 0;
	IPSrc130[2] = 0;
	IPSrc130[3] = 0;
	IPSrc130[4] = 0;
		{
		CURRENT_FIELD += 1;
		IPSrc130[1] = $CURRENT_FIELD
		CURRENT_FIELD += 1;
		IPSrc130[2] = $CURRENT_FIELD
		CURRENT_FIELD += 1;
		IPSrc130[3] = $CURRENT_FIELD
		CURRENT_FIELD += 1;
		IPSrc130[4] = $CURRENT_FIELD
		}
  sprintf("%s:%s:%s:%s",IPSrc130[1],IPSrc130[2],IPSrc130[3],IPSrc130[4]);
  printf("Sorce_IP: %s:%s:%s:%s" ,IPSrc130[1],IPSrc130[2],IPSrc130[3],IPSrc130[4]);
}
function ParseIPDest140()
{
	IPDest140[1] = 0;
	IPDest140[2] = 0;
	IPDest140[3] = 0;
	IPDest140[4] = 0;
	{
		CURRENT_FIELD += 1;
		IPDest140[1] = $CURRENT_FIELD
		CURRENT_FIELD += 1;
		IPDest140[2] = $CURRENT_FIELD
		CURRENT_FIELD += 1;
		IPDest140[3] = $CURRENT_FIELD
		CURRENT_FIELD += 1;
		IPDest140[4] = $CURRENT_FIELD
	}
  sprintf("%s:%s:%s:%s",IPDest140[1],IPDest140[2],IPDest140[3],IPDest140[4]);
  printf(" Destination_IP: %s:%s:%s:%s",IPDest140[1],IPDest140[2],IPDest140[3],IPDest140[4]);
}

function ParsePortSrc150()
{
CURRENT_FIELD +=2;
}

function ParsePortDest160()
{
CURRENT_FIELD +=2;
}
function ParseOverallLength170()
{
OverallLength170[1] = 0;
OverallLength170[2] = 0;
	{
		CURRENT_FIELD += 1;
		OverallLength170[1] = $CURRENT_FIELD
		CURRENT_FIELD += 1;
		OverallLength170[2] = $CURRENT_FIELD
	}
	sprintf("%02s:%02s",OverallLength170[1],OverallLength170[2]);
	printf(" Overall_Length: %02s:%02s\n",OverallLength170[1],OverallLength170[2]);
}
function ParsePortHash180()
{
CURRENT_FIELD +=2
}
function ParseData190()
{
CURRENT_FIELD +=1;
??????

}
Почти все работает кроме 2-х вещей:
1) мне нужно реализовать вывод информации не HEX как сей час получется в нормальном виде
2) чтобы остальная часть пакета, которая содержит полезную информацию, то есть данные выводились тоже, в декодированном виде.
Очень долго читал различную литературу, но решение не нашел, уже как неделю мучаюсь(

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35426
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Проблема с написанием AWK скрипта

Непрочитанное сообщение Alex Keda » 2011-07-31 21:16:29

эта... wireshark ваш формат не умеет?
Убей их всех! Бог потом рассортирует...

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Проблема с написанием AWK скрипта

Непрочитанное сообщение kpp » 2011-07-31 22:40:27

Преобразовать из HEX в DEC

Код: Выделить всё

awk '{printf "%d\n", hex}
В переменной hex должно быть значение вида: 0xFF, где FF - HEX для преобразования.
По остальному не понял что значит "выводить в декодированном виде".
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

cromarty
проходил мимо
Сообщения: 3
Зарегистрирован: 2011-07-31 18:11:25

Re: Проблема с написанием AWK скрипта

Непрочитанное сообщение cromarty » 2011-07-31 23:25:33

kpp писал(а):Преобразовать из HEX в DEC

Код: Выделить всё

awk '{printf "%d\n", hex}
В переменной hex должно быть значение вида: 0xFF, где FF - HEX для преобразования.
По остальному не понял что значит "выводить в декодированном виде".
имелось ввиду как раз это преобразование

cromarty
проходил мимо
Сообщения: 3
Зарегистрирован: 2011-07-31 18:11:25

Re: Проблема с написанием AWK скрипта

Непрочитанное сообщение cromarty » 2011-07-31 23:26:09

Alex Keda писал(а):эта... wireshark ваш формат не умеет?
то есть?