Поиск и фильтрация текста в больших файлах журналов

Поиск и фильтрация текста в больших файлах журналов

Я использую команды tail, head и grep для поиска в файлах журналов. В большинстве случаев комбинация этих 3 команд, в дополнение к использованию pipe, выполняет работу. Однако у меня есть один журнал, в который многие устройства отправляют отчеты буквально каждые несколько секунд. Так что этот журнал очень большой. Но шаблон отчетов тот же:

Oct 10 11:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0xD 0xD 0xD 
Oct 10 11:58:50 Unit ID: 1111

В приведенном выше примере показано, что пакет UDP был отправлен на сокет-сервер для определенного идентификатора устройства.

Теперь иногда мне нужно просмотреть информацию о пакетах для этого устройства за определенный промежуток времени, запросив журнал.

Oct 10 11:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0xD 0xD 0xD 
Oct 10 11:58:50 Unit ID: 1111

... // A bunch of other units reporting including unit id 1111

Oct 10 23:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x28 0x28 0x28 
Oct 10 23:58:50 Unit ID: 1111

Итак, в приведенном выше примере я хотел бы отобразить вывод журнала только для идентификатора устройства: 1111 в диапазоне времени от 11:58 до 23:58. Поэтому возможные результаты могут выглядеть следующим образом:

Oct 10 11:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0xD 0xD 0xD 
Oct 10 11:58:50 Unit ID: 1111

Oct 10 12:55:11 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x28 0xD 0x28 
Oct 10 12:55:11 Unit ID: 1111

Oct 10 15:33:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x33 0xD 0x11 
Oct 10 15:33:50 Unit ID: 1111

Oct 10 23:58:50 Received Packet from [xxx.xx.xxx.xx:xxxx]: 0x28 0x28 0x28 
Oct 10 23:58:50 Unit ID: 1111

Обратите внимание, что в результатах отображается только информация об идентификаторе блока: 1111, а не о других блоках.

Теперь проблема с использованием чего-то вроде этого:

tail -n 10000 | grep -B20 -A20 "Oct 10 23:58:50 Unit ID: 1111" 

что будет отображать много информации, а не только то, что мне нужно.

решение1

awk '$3 >= "11:58" && $3 <= "23:58" && /Unit ID: 1111/{print l"\n"$0};{l=$0}'

Связанный контент