2014-12-15 2 views
0

Я пытаюсь вставить вывод tshark в базу данных MySQL. Выход Tshark имеет формат:AWK с несколькими разделителями

VALUE1:VALUE2_1|VALUE2_2|VALUE2_3:VALUE3_1,VALUE3_2,VALUE3_3:VALUE4:VALUE5 

В настоящее время я пытаюсь перенаправить вывод через трубу СЭД и AWK:

|sed -u "s/^/insert into data (item1, item2, item3, item4, item5) values('/g"|awk -F":" -v OFS=',' '{print $1,$2}' 

, но только некоторые значения необходимы.

Так что результирующая команда должна выглядеть следующим образом:

insert into data (item1, item2, item3, item4, item5) values(value1,value2_2,value3_2,value4,value5) 

И некоторые примеры из среды разработки:

Tshark постоянно генерирует эти виды продукции:

1418043291.268345000:14567744356|4|8v95489464:DC0289001840,NNN100,DC206286661:03612037:ON1774B01 
1418043291.201703000:14567744356|0|6b10992051:DC0289001840,NNN120,DC081276320:04891241:ON891N619 

, где

  1. 1418043291,268345000 - VALUE1
  2. 14567744356 | 4 | 8v95489464 - VALUE2
  3. DC0289001840, NNN100, DC206286661 - VALUE3
  4. 03612037 - Value4
  5. ON1774B01 - VALUE5

Для VALUE2 и Value3 заинтересован только средний ряд, то есть «4» для VALUE2 и «NN100» для VALUE3. Все остальные строки из этих значений (значение2, Value3) не являются необходимыми для дальнейших расчетов с выходом стороны, поэтому они должны быть отброшены, и в результате команда вставки сусло выглядит следующим образом:

insert into data (item1, item2, item3, item4, item5) values(1418043291.268345000,4,NNN100,03612037,ON1774B01) 

Не могли бы вы посоветовать , как изменить команду AWK для вставки значений:

VALUE1:VALUE2_2:VALUE3_2:VALUE4:VALUE5 ? 
+1

ясно, что вы хотите, но немного неясно, как вы туда попадете: какое общее правило знать, какие поля нужно выбирать, а какие следует отбрасывать? – fedorqui

+0

Каким критериям присваивается «хорошее» значение? почему значение 2_1, value2_3 и value3_3 отбрасываются (каждый с разным разделителем pre или post типа, но тот же, что и один из другого, который берется)? Это просто произвольный заказ? – NeronLeVelu

+0

fedorqui, NeronLeVelu, спасибо за ответ! Я добавил несколько более подробных объяснений – Alex

ответ

0

на основе вашего образца, и объяснение несколько упрощения и не AWK (не требуется в этом случае и тяжелее для OS)

sed 's/\([^:]*\):[^|]*|\([^|]*\)|[^,]*,\([^,]*\),[^:]*:\([^:]*\):\(.*\)/insert into data (item1, item2, item3, item4, item5) values(\1,\2,\3,\4,\5)/' YourFile 

(POSIX версия так --posix на GNU SED)

реальная полная структура использует полную стоимость и подгруппы:

sed 's/\([^:]*\):\([^|]*|\([^|]*\)|^[^:]*\):\([^,]*,\([^,]*\),[^:]*\):\([^:]*\):\(.*\)/insert into data (item1, item2, item3, item4, item5) values(\1,\3,\5,\6,\7)/' YourFile 

Теперь, AWK только возможно также, SED с последующим AWK, чтобы избежать (часто возможно) для точки зрения производительности и восприятия

+0

И еще один вопрос: если я пытаюсь добавить дополнительные значения (добавив regex \ ([^:] * \)): 1.до 9 значений - все в порядке 2.> значение 9 - проблема возникает. \ 10, \ 11 .. \ 19 значение печатает значение \ 1. Как решить эту проблему? – Alex

+0

Да, у sed есть ограничение до 9 групп. Вам нужно сделать это в нескольких s /// или использовать ярлык, если это возможно, чтобы ограничить группу до max 9 – NeronLeVelu