Изменение структуры файла журнала Linux для использования с kst

Мой файл (tcp dump от сетевых датчиков) имеет такую ​​форму:

 20: 06: 57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), длина 68)
     e108-193.eduroam.tugraz.ac.at.34225> e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, длина 40
     0x0000: 4500 0044 68f7 4000 4011 25c7 8083 d0bf E..Dh. @. @.% .....
     0x0010: 8083 da24 85b1 15b3 0030 1e8b 3132 3033 ... $ ..... 0..1203
     0x0020: 3132 2e37 3836 3036 2c20 332c 2020 2030 12.78606, .3, ... 0
     0x0030: 2e31 3533 2c20 2d30 2e31 3533 2c20 2039 .153, .- 0,153, ... 9
     0x0040: 2e39 3630 .960
 20: 06: 57.113591 IP (tos 0x0, ttl 64, id 26872, смещение 0, флаги [DF], протокол UDP (17), длина 68)
     e108-193.eduroam.tugraz.ac.at.34225> e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, длина 40
     0x0000: 4500 0044 68f8 4000 4011 25c6 8083 d0bf E..Dh. @. @.% .....
     0x0010: 8083 da24 85b1 15b3 0030 148f 3132 3033 ... $ ..... 0..1203
     0x0020: 3132 2e38 3336 3131 2c20 332c 2020 2d30 12.83611, .3, ..- 0
     0x0030: 2e31 3533 2c20 2d30 2e34 3630 2c20 2039 .153, .- 0.460, .. 9
     0x0040: 2e39 3630 .960
 20: 06: 57.188105 IP (tos 0x0, ttl 64, id 26873, offset 0, flags [DF], proto UDP (17), длина 68)
     e108-193.eduroam.tugraz.ac.at.34225> e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, длина 40
     0x0000: 4500 0044 68f9 4000 4011 25c5 8083 d0bf E..Dh. @. @.% .....
     0x0010: 8083 da24 85b1 15b3 0030 1b80 3132 3033 ... $ ..... 0..1203
     0x0020: 3132 2e38 3836 3135 2c20 332c 2020 2d30 12.88615, .3, ..- 0
     0x0030: 2e31 3533 2c20 2d30 2e33 3036 2c20 2039 .153, .- 0,306, ... 9
     0x0040: 2e38 3037 .807                                 
 20: 06: 57.200719 IP (tos 0x0, ttl 64, id 26874, offset 0, flags [DF], proto UDP (17), длина 68)
     e108-193.eduroam.tugraz.ac.at.34225> e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, длина 40
     0x0000: 4500 0044 68fa 4000 4011 25c4 8083 d0bf E..Dh. @. @.% .....
     0x0010: 8083 da24 85b1 15b3 0030 2884 3132 3033 ... $ ..... 0 (.1203
     0x0020: 3132 2e39 3336 3135 2c20 332c 2020 2030 12.93615, .3, ... 0
     0x0030: 2e31 3533 2c20 2d30 2e31 3533 2c20 2039 .153, .- 0,153, ... 9
     0x0040: 2e38 3037 .807

и мне нужно преобразовать его в эту или подобную форму:

 20: 06: 57.049686 26871, 120312.78606, .0.153, .- 0.153, ... 9.960
 20: 06: 57.113591 26872, 120312.83611, -0,153, 0,460, .. 9,960
 20: 06: 57.188105 26873, 120312.88615, -0,153, .- 0,306, ... 9,807
 20: 06: 57.200719 26874, 120312.93615, .0.000, - 0.153, ... 9.807

Пока скрипт vb отлично справлялся с работой, но теперь нам нужно, чтобы эти данные отображались в реальном времени, поэтому должен быть скрипт, который будет использовать grep / cut / awk для любых команд, которые будут выполняться при обновлении журнала, следовательно, открытие файла, когда его завершение и использование vbscript в libre-office уже не хорошо.

Какие-либо предложения?

One Solution collect form web for “Изменение структуры файла журнала Linux для использования с kst”

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

Здесь опять снова, другое:

 #!/bin/sh robot() (s=[:blank:];LC_ALL=C \ sed "s/^[$s].*[$s]//;s/\.\.*/./g /[$s][^i$]*[^1-9d]*[d$s]*/!{H;\$!d }; s//,/;x;s///;s/\n//g s/,\.\([-1-9]*\)0*// s//,\1/g;s//,+.\1/g" "$@" ) robot "$@" 

Если верхняя и нижняя строки удалены из вышеперечисленного, его можно скопировать / вставить в запущенную POSIX-совместимую оболочку, которая включает в себя POSIX-совместимое sed в $PATH . Иначе вышесказанное может быть написано дословно исполняемому файлу в $PATH . В любом случае, я могу назвать это так же, как INPUT| robot INPUT| robot или robot <infile или robot infile1 infile[2-9] - . Подобно:

 robot <<\DATA 20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68) e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, length 40 0x0000: 4500 0044 68f7 4000 4011 25c7 8083 d0bf E..Dh.@.@.%..... 0x0010: 8083 da24 85b1 15b3 0030 1e8b 3132 3033 ...$.....0..1203 0x0020: 3132 2e37 3836 3036 2c20 332c 2020 2030 12.78606,.3,...0 0x0030: 2e31 3533 2c20 2d30 2e31 3533 2c20 2039 .153,.-0.153,..9 0x0040: 2e39 3630 .960 DATA 

В то время как более старая версия печатается …

 20:06:57.049686,26871,.0.120312.78606,.3,.0.153,-0.153,.9.960 

Это печатает …

 20:06:57.049686,26871,120312.78606,+.153,-.153,9.960 

Теперь он разбивает ведущие .dots или 0zeroes из разных полей и удаляет ложное поле .3 он получил до того, как оно не было включено в ваш вывод. Он также добавляет знаки + к выводам для полей, которые могут приводить к -dash .

Может быть, это слишком много – я честно не знаю, как все эти поля должны собраться вместе, и это только сводится к моему лучшему предположению. Я пытаюсь сломать его ниже, но если вы хотите, чтобы он делал что-то другое по любой причине, не стесняйтесь спрашивать.

Класс символов [:blank:] соответствует любому горизонтальному символу пробела, определенному в локали, – и поэтому это может быть пробел или вкладка, и это не будет иметь никакого значения. И, думая о локали, я решил явно указать локаль C здесь, поскольку это всегда самое разумное, что нужно делать при обработке текста. C локали C каждый входной байт гарантированно соответствует одному символу (что может означать многозначность к sed когда он делает что-то вроде .* ) . Любое состояние, определенное в функции, является локальным только для этой функции и не будет влиять на среду выполнения, кроме как на печать в stdout .

ТЕЧЬ:

В первой строке сценария sed удалит последовательность символов с первого по последний раз [[:blank:]] если строка начинается с одной. Затем он также заменяет любую серию .dot с одним .dot .

Следующая строка немного волосатая. Это единый адрес, предназначенный для обработки многоэтапных s/// ubstitutions с использованием пустого адреса для ссылки на последний непустой в скрипте.

 /[$s][^i$]*[^d1-9]*[d$s]*/ 

Единственное определенное совпадение в адресе – это хотя бы один пробел – все остальные последовательности в нулевом совпадении * или более вхождения – и поэтому он не может соответствовать строке, которая вообще не содержит пробелов. Это означает, что он соответствует только заголовкам блоков, потому что мы просто удалили все пробелы из любой строки, начинающейся с одной.

Поэтому первое, что я делаю, это сравнить его с строками без заголовка и поместить их в старое пространство H если они это сделают ! не совпадают с этим, и все это ! а не $ последним с выхода. И поэтому последняя последняя строка заканчивается, чтобы сосредоточиться на всех заголовках блоков для остальной части скрипта, потому что отсюда это единственные строки, к которым sed будет применять какие-либо правила.

Рассмотрим адрес по сравнению с линией заголовка:

 20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68) 
  • [$s] – соответствует первому пробелу – непосредственно перед IP .
  • [^i$]* – соответствует 64,[[:blank:]] .
  • [^d1-9]* - matches the i`.
  • [d$s]* – соответствует d и [[:blank:]]

Поэтому, когда я делаю s//,/ все это заменяется запятой. Это не влияет на последнюю строку, которую мы просто пропускаем, потому что она не может соответствовать ведущему [[:blank:]] . И даже если бы это было так, любые изменения были бы неактуальными, потому что для последней строки единственная копия, когда-либо напечатанная, – это то, что ждет нас в старом пространстве H котором мы работаем только после изменения e x . Какая следующая команда – и применяется повсеместно – и поэтому мы теперь работаем с пространством шаблонов, которое выглядит примерно так …

 20:06:57.049686,26871, offset 0, flags [DF], proto UDP (17), length 6\ 8)\n40\nE.Dh.@.@.%.\n.$.0.1203\n12.78606,.3,.0\n.153,.-0.153,.9\n.960$ 

… который представляет собой изменения, уже примененные к предыдущему заголовку блока, и все строки, которые были с тех пор, – поскольку вы можете видеть, что они ограничены с помощью \n ewline escapes.

Давайте сравним это снова с нашим длинным адресом:

  • [$s] – соответствует первой [[:blank:]] происходит непосредственно перед offset .
  • [^i$]* – соответствует вплоть до первого встречного символа $ .
  • [^d1-9]* – соответствует .0. ,
  • [d$s]* – ничего не соответствует.

Итак, как и прежде, s/// вытирает все это. После удаления всех \n ewlines, таких как s/\n//g теперь пространство шаблонов выглядит так:

 20:06:57.049686,26871,120312.78606,.3,.0.153,.-0.153,.9.960 

… в значительной степени там, где его оставила старая версия. Но я получал удовольствие от рекурсивных матчей, поэтому я добавил немного. Вы не должны, хотя, хотя я, вероятно, мог бы сделать это лучше, поскольку я нахожу в нем дыры, этот последний бит, вероятно, лучше сделать во втором фильтре со свежим сценарием, нацеленным на csv. Тем не менее, он определенно работает с примером ввода и, вероятно, будет с большим количеством, но я думал, что я просто могу отказаться от него в любом случае, если это не так, или если это так, но не соответствует вашим ожиданиям. Последние две строки можно легко удалить, чтобы получить результат в соответствии с тем, который вы приняли, когда вы проверили этот ответ – как показано выше.

 s/,\.\([-1-9]*\)0*// 

Это удаляет первую встречающуюся последовательность a , запятую, за которой следует символ .dot , затем нуль или больше -dash или числа, которые не равны нулю и любые конечные нули. Это приведет к удалению поля ,.3 из вывода.

Применяется во второй раз с флагом gobal и сохраняя \1 из удаляемого как s//,\1/ и преобразует:

 20:06:57.049686,26871,120312.78606,.0.153,.-0.153,.9.960 

…в…

 20:06:57.049686,26871,120312.78606,.153,-.153,9.960 

Еще один раз применяется к локально с добавленным +. например s//,+./g а также изменяет пространство шаблонов следующим образом:

 20:06:57.049686,26871,120312.78606,+.153,-.153,9.960 

… это то, что затем автоматически печатается в stdout прежде чем sed начнет следующий цикл строки.

если какой-либо читатель действительно сделал это до сих пор и интересуется, что я имею в виду по старой версии, вы найдете его и подробное объяснение того, как он работает в истории изменений

Корректируя этот скрипт, весь ваш ввод ввода:

 20:06:57.049686,26871,120312.78606,+.153,-.153,9.960 20:06:57.113591,26872,120312.83611,-.153,-.460,9.960 20:06:57.188105,26873,120312.88615,-.153,-.306,9.807 20:06:57.200719,26874,120312.93615,+.153,-.153,9.807 
  • Заменить соответствующие круглые скобки с содержимым
  • Измените значение xml uttribut документа xml с помощью селектора
  • Linux и Unix - лучшая ОС в мире.