Опрос постоянно обновляемого текстового файла, чтобы вырезать выбранную информацию - PullRequest
2 голосов
/ 09 февраля 2020

У меня есть журнал, работающий в режиме реального времени и сохраняющий в текстовый файл с помощью команды «script» с именем «test.txt» в / home / pi / также в режиме реального времени. Теперь я хочу настроить процесс, который постоянно опрашивает этот текстовый файл на предмет изменений и удаляет определенный c повторяющийся бит данных. Например, часть журнала будет выглядеть так:

Feb  9 11:43:24 dnsmasq[887]: query[A] captive.g.aaplimg.com from 192.168.178.21
Feb  9 11:43:24 dnsmasq[887]: forwarded captive.g.aaplimg.com to 8.8.4.4
Feb  9 11:43:24 dnsmasq[887]: reply captive.g.aaplimg.com is 17.253.55.202
Feb  9 11:43:24 dnsmasq[887]: reply captive.g.aaplimg.com is 17.253.57.211
Feb  9 11:43:54 dnsmasq[887]: query[A] captive.g.aaplimg.com from 192.168.178.21

И я хочу вырезать информацию только из строк с запросом [A] (при условии, что это можно использовать в качестве маркера), чтобы вывод текст выглядит так:

11:43 captive.g.aaplimg.com

Но проблема в том, что к этой строке журнала прикреплены разные URL-адреса, поэтому, например, строка с запросом [A] также может выглядеть следующим образом:

Feb  9 11:49:56 dnsmasq[887]: query[A] www.googleapis.com from 192.168.178.21

Тогда я бы хотел, чтобы выходные данные были:

11:49 www.googleapis.com

Но это должно происходить в режиме реального времени, так как текстовый файл / журнал обновляется, потому что я хочу, чтобы этот текстовый файл был постоянно опрашивается и отправляется на принтер также в режиме реального времени (длинная история)

Я искал awk + sed, чтобы вырезать нужную мне информацию, но они для меня новы, поэтому я нахожу формат немного сбивает с толку, и мне особенно трудно понять, как его запустить, чтобы это происходило в режиме реального времени.

Запуск на Debian Buster на Pi.

Хотелось бы помочь! Спасибо

1 Ответ

3 голосов
/ 10 февраля 2020

Я предполагаю, что вы ищете что-то вроде этого:

tail -f my.log | perl -nle 'print"$1$2" if /(\d\d:\d\d):\d\d.*query\[A\]( \S+)/' > test.txt

-f постоянно выводит последние строки по мере роста файла my.log. Он подает строки в небольшую однострочную программу perl, которая ищет query[A] (экранируя символы [ и ] с \, так как в противном случае они имеют особое значение в регулярных выражениях), и когда найдено, выводит время в часах и минутах и ​​доменное имя, захваченное регулярным выражением в $1 и $2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...