Вопрос или проблема
Попытка отформатировать файл tcpdump.txt:
- Строки, содержащие дату, интерфейс, протокол и т. д.
- Строки, содержащие сетевой источник устройство.порт, устройство назначения.порт, флаги и т. д.
- Лишние строки (игнорировать)
Ввод:
- 2024-10-02,15:23:17.961802,br0,Out,IP,,
- device1-LAN.522,>,device2-LAN.56248:,Flags,,
- 2024-10-02,15:23:17.961821,eth5,Out,IP,,
- 0x0010: 0034 844a 4000 3f06 8fe9 c0a8 330b acd4 .4.J@.?…..3…
- 0x0030: 01ff 00ab 0000 0101 080a e9d3 ecca 22d6 …………..”.
- 2024-09-27 11:18:30.389705, eth0,Out, IP,,
- device1-LAN.522,>,device2-LAN.56248:,Flags,,
- 2024-10-02,15:23:17.962931,br0,Out,IP,,
- device1-LAN.522,>,device2-LAN.56248:,Flags,,
- 2024-09-27 11:18:30.445834 eth0 Out
- 0x0000: 00e0 6715 cf81 08bf b8c9 a448 0800 4500 ..g……..H..E.
- 0x0020: 8708 87ce 01bb 04f8 16eb 3b51 8be8 8018 ……….;Q..
- ещё строки …
Цель состоит в том, чтобы объединить строки, содержащие дату, интерфейс, протокол и т. д., со строками, содержащими сетевой источник устройство.порт, устройство назначения.порт, флаги и т. д.:
Вывод:
- 2024-10-02,15:23:17.961802,br0,Out,IP,,device1-LAN.522,>,device2-LAN.56248:,Flags,,
- 2024-10-02,15:23:17.961821,eth5,Out,IP,,device1-LAN.522,>,device2-LAN.56248:,Flags,,
- 2024-10-02,15:23:17.962931,br0,Out,IP,,device1-LAN.522,>,device2-LAN.56248:,Flags,,
- ещё строки …
Существует ли решение на awk для такого типа сопоставления шаблонов и объединения строк?
Ответ или решение
Для решения задачи по слиянию строк в файле tcpdump.txt, можно использовать awk
, который является мощным инструментом для обработки текстовых данных. Ваша задача состоит в том, чтобы объединить строки, содержащие информацию о дате, интерфейсе и протоколе, с последующими строками, содержащими информацию о сетевых источниках, портах и флагах.
Ниже приведен пример сценария awk
, который выполняет указанную задачу:
awk -F, '
# Если строка соответствует формату даты, интерфейса и протокола
/^[0-9]{4}-[0-9]{2}-[0-9]{2},[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{6},/ {
if (prev_line != "") {
# Если есть предыдущая строка, объединяем её с текущей строкой
print prev_line "," $0
# Сбрасываем предыдущую строку
prev_line = ""
} else {
# Сохраняем текущую строку для последующего объединения
prev_line = $0
}
next
}
# Если строка соответствует формату устройства и порта
/^[^,]+-[^,]+\.[0-9]+,>,[^,]+-[^,]+\.[0-9]+:.*$/ {
# Если предыдущая строка установлена, добавляем к ней
if (prev_line != "") {
prev_line = prev_line "," $0
}
next
}
# Игнорируем остальные строки
' tcpdump.txt
Объяснение сценария:
-
Задание разделителя полей:
-F,
указывает на использование запятой в качестве разделителя полей. -
Обработка строк с датой и протоколом:
- Регулярное выражение проверяет, соответствует ли строка формату даты (ГГГГ-ММ-ДД), времени, интерфейса и протокола.
- Если такая строка найдена, проверяется, существует ли предыдущая строка (сохраняемая в
prev_line
). Если она существует, обе строки объединяются и выводятся. - Если предыдущей строки нет, текущая строка сохраняется в
prev_line
.
-
Обработка строк с устройствами и портами:
- Регулярное выражение проверяет, соответствует ли строка формату, содержащему информацию о сетевых устройствах и портах.
- Если такая строка найдена, она добавляется к
prev_line
, если последняя строка все еще сохраняется.
-
Игнорирование остального: Остальные строки (включая лишние данные) просто игнорируются.
Запуск сценария:
Чтобы выполнить данный сценарий, вам нужно сохранить его в файл (например, script.awk
) и запустить его с помощью команды:
awk -f script.awk tcpdump.txt > output.txt
Данный подход позволяет эффективно обрабатывать текстовый файл, объединяя соответствующие строки, исключая лишние данные, в соответствии с вашими требованиями. Выходной файл output.txt
будет содержать нужные объединенные строки.