2016-12-13 3 views
0

Я пытаюсь очистить следующий файл:Внесите изменения в файл (SED, AWK)

1. 10.160.120.10 ; 140.0.0.40 ;Data-- 1155~00120~xtl~12/01/2016 03:00:24~000BBBBBA4FB~ÍežG5„È&gÈ[email protected]Ÿ#•Œ‘„¦åEI²6frÞõ+ã:®*ÓÓÂ"ða5»V$è~ 
2. ¼?Amµxðïej£„7‹ìËÏð‡.4 -- 
3. 10.160.120.11 ; 140.10.10.10 ;Data-- 1155~00120~xtl~12/01/2016 03:00:54~2B3BB1EB1BBB~£ˆD]†CÀ,£ÑÉ»In&Ry+/jÑ%A¡ã ÷d_#C÷—NÏÕÞ 
3. Ü‚úè"åD\’c\ûñ7x°yFæï -- 

Обратите внимание, что номера не являются фактической частью файла. Это всего лишь ссылка на количество строк. Размер строки зависит от закодированного сообщения (вот почему 3 перезаписывается, потому что это в основном одна строка). Есть тысячи записей, но они соответствуют одному и тому же шаблону. Каждая запись заканчивается на (-).

В основном, я пытаюсь добиться того, чтобы просто получить IP-адреса бок о бок.

Например:

10.160.120.10 000BBBBBA4FB 

Мой первый шаг должен был бы удалить все между первым (;) и четвёртой (~), так как этот шаблон является одинаковым для каждой записи.

Это приводит меня к этому.

sed 's/;.*~//' 

Однако эта конкретная команда удалит все до последнего (~), а не четвертого.

Если успешно удаляет все между первым (;) и четвёртой (~) было бы заставить меня что-то вроде этого:

0.165.65.113 0008B9A4F3 ~ ÍežG5„ Э. & Gee @ Ÿ # • Œ « |åEI²6frÞõ + ã: ® * ООА "DA5» V $ è ~ ¼ Amμxðïej £? «7 <ìËÏð ‡ 0,4 -

И тогда я предполагаю, что я мог бы удалить все после первой (~), так что я могу получить нужный результат.

Я следую правильной процедуре? Должен ли я достичь этого с помощью swd или awk? Любое предложение iated!

+0

Если вы хотите удалить следующую тильду, используйте '[^ ~] * ~' вместо '. * ~'. Второй тильде, '[^ ~] * ~ [^ ~] * ~' и т. Д. –

+0

Да, это было полезно. Спасибо! –

ответ

0

Вместо того, чтобы пытаться удалить материал, почему бы вам просто не оставить нужные вещи?

sed -r -n 's/^[^0-9]*(([0-9]{1,3}\.){3}[0-9]{1,3}).*([0-9A-F]{12}).*$/\1 \3/p' 
#     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ 
#     IP Address      12 Hex digits 

Объяснение:

  1. \1 \3 означает ввести все, что соответствует первому и третьему набору скобки поиска.
  2. ^[^0-9]* соответствует всем не-цифрам с начала файла
  3. ([0-9]{1,3}\.){3}[0-9]{1,3} соответствует IP-адресу. Весь термин заключен в круглые скобки, потому что мы хотим сохранить его. Внутренний (...) можно назвать \2 в заменяющем термине, но нам это не нужно.
  4. [0-9A-F]{12} это просто 12 шестнадцатеричных цифр (верхний регистр, использование `[0-9a метрономы-F], если вы ожидаете более низкие случаи, а)
+0

О, никогда, хотя об этом! Но да, это, безусловно, работает! Спасибо! –

0

Если предположить, что Struture данные одинаковые

использование несколько разделителей полей одновременно с классом, включая «;» и "~".Будьте осторожны, не пространство в одиночку в качестве разделителя, как по умолчанию, которые возвращают другое поле 3 (и 6)

awk -F '[[:blank:]*[;~][[:blank:]]*' '/--$/ {print $1 " " $7}' YourFile 

Предполагая, что есть только пространство, голец и нет вкладки в качестве разделителя и линии передачи данных имеют данные

awk -F ' *[;~] *' '/--$/ {print $1 " " $7}' YourFile 
Смежные вопросы