Intereting Posts
Что такое ошибка проверки транзакции? (обновление yum) VPN на Fedora Linux? Сжатие / домашний раздел до двух разделов yum – проверить, установлен ли пакет Правильный способ использования пакетов репозитория Установщик Debian упомянул, что неиспользуемые LVM VG и LV будут «отформатированы», sssd / ad no ssh login после миграции debian 8 => 9: Доступ запрещен для пользователя xxx: 4 (системная ошибка) Почему я вижу гораздо больше рабочих заданий cron в webmin, чем в `crontab -e`? настройка httpd для нескольких доменов на одном сервере Ошибка в пакетах i686, не найденных при установке с помощью yum? (по архитектуре x64) Что такое подходящая структура именования для хранения пакетов приложений? Linux дросселя на этикетках интерфейса> 16 символов в Fedora 20+ Временный доступ по SSH для SFTP Найти файлы с тем же именем, но с разными расширениями, отправить в tgz grepping для нескольких элементов

Как извлечь определенные данные из потока MQTT

Я mosquitto_sub -d -t +/# из терминала Ubuntu для доступа к потоку MQTT.

Однако я хотел бы видеть только определенный набор данных из потока MQTT. Я добавил | grep -v PING | grep -v PING поэтому все еще печатается, за исключением строк с PING в них, но это не работает.

Я пробовал | grep -A1 PUBLISH | grep -A1 PUBLISH поэтому я могу видеть строки из MQTT с PUBLISH в них, ничего не изменилось: я просто получаю весь поток MQTT, ничто не отфильтровывается.

Как я могу увидеть определенную вещь, которую хочу видеть из потока MQTT? В качестве альтернативы; как я могу отфильтровать некоторые вещи из потока MQTT или как я могу извлечь данные из потока MQTT?

Мой вход с терминала ubuntu выглядит следующим образом: $ mosquitto_sub -d -t +/# и я пробовал $ mosquitto_sub -d -t +/# | grep -v PING $ mosquitto_sub -d -t +/# | grep -v PING и $ mosquitto_sub -d -t +/# | grep -A1 PUBLISH $ mosquitto_sub -d -t +/# | grep -A1 PUBLISH но он просто $ mosquitto_sub -d -t +/# | grep -A1 PUBLISH все, ничего не grep. Вывод выглядит следующим образом:

 ed@agharta:~$ mosquitto_sub -d -t +/# Received CONNACK Received SUBACK Subscribed (mid: 1): 0 Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Received PUBLISH (d0, q0, r0, m0, 'm/jsyd/TEST/001/d/status', ... (34 bytes)) Sending PINGREQ Received PINGRESP Received PUBLISH (d0, q0, r0, m0, 'm/jsyd/TEST/001/d/SVlts', ... (28 bytes)) Sending PINGREQ Received PINGRESP 

Например, как я могу видеть только PUBLISH из прямого потока, а не PING?

Я был в процессе написания следующего ответа на другой, связанный с этим вопрос, когда он был удален. Я не знаю, сможете ли вы следовать этой ссылке, но (аббревиатура) приведенных ниже примеров данных:

 Sending PINGREQ Received PINGRESP Sending PINGREQ Received PINGRESP Received PUBLISH (d0, q0, r0, m0, 'm/gf/TMX6BP/075/d/SVlts', ... (28 bytes)) 86,1224830,27610 27869 17565 Received PUBLISH (d0, q0, r0, m0, 'm/gf/TMX6BP/075/d/status', ... (39 bytes)) 86,1243000,164573,-33.836465,151.051189 Sending PINGREQ Received PINGRESP 

Поэтому я написал следующее, чтобы заставить его работать с sed следующим образом:

 mosquitto ... 2>&1 | sed -u "/.*PUBLISH[^']*\([^,]*,\).*/!ds//\1/;N;s/[\%]/&&/g;s/'/&\\\\&&/g s/.*/printf '&'/;s/\n/'&date '+[%s,]/"| sh -s 

Теперь у меня нет вашей программы mosquitto , но если я mosquitto весь этот пример в свой буфер обмена и сделаю следующее:

 xsel -bo | sed ... | sh ... 

Он печатает:

 'm/gf/TMX6BP/075/d/SVlts',[1425002404,]86,1224830,27610 27869 17565 'm/gf/TMX6BP/075/d/status',[1425002404,]86,1243000,164573,-33.836465,151.051189 'm/NWRL/TMX/098/d/SVlts',[1425002404,]806,3040421,7549 7750 3904 'm/NWRL/TMX/098/d/status',[1425002404,]806,3069000,59666,-33.836465,151.051189 'm/NWRL/TMX/098/d/SVlts',[1425002404,]810,5440995,6143 7807 4076 'm/NWRL/TMX/098/d/status',[1425002404,]810,5489000,59897,-33.836465,151.051189 

… который, я думаю, вы хотите. Он работает, гарантируя, что все входные данные безопасно цитируются как для строк оболочки, так и для строк date и printf , а затем строят команды оболочки из каждой пары линий.

Для каждой пары строк printf сначала печатает содержимое первой строки без конечной \n строки, тогда date печатает [timestamp] временную [timestamp] в секундах с момента эпохи, за которой следуют содержимое второй строки и завершающая \n строка. вывод sed выглядит примерно так:

 printf ''\''m/gf/TMX6BP/075/d/SVlts'\'',' date '+[%s,]86,1224830,27610 27869 17565' 

Разумеется, ни одна из команд, напечатанных в sh , не выполняется до тех пор, пока sed напечатает их на ней. Поэтому, если sed читал mosquitto , и одна строка появилась позже предыдущей, тогда строка date будет отражать это.

Например:

 (set -f; IFS=' '; for l in $(xsel -bo) do printf %s\\n "$l" sleep 1 done) | sed -u "/.*PUBLISH[^']*\([^,]*,\).*/!ds//\1/;N;s/[\%]/&&/g;s/'/&\\\\&&/g s/.*/printf '&'/;s/\n/'&date '+[%s,]/"| sh -s 

… который ждет секунду, прежде чем печатать каждую выходную строку в sed , чтобы более точно эмулировать живой поток. Он использует коммутатор GNU sed -u nbuffered, чтобы вывести поток sed как можно чаще, но если это не доступно для вас, дайте мне знать, и я покажу вам, как правильно блокировать канал w / dd до избегайте проблем с буферизацией.

В любом случае, вышеприведенные отпечатки:

 'm/gf/TMX6BP/075/d/SVlts',[1425002863,]86,1224830,27610 27869 17565 'm/gf/TMX6BP/075/d/status',[1425002865,]86,1243000,164573,-33.836465,151.051189 'm/NWRL/TMX/098/d/SVlts',[1425002869,]806,3040421,7549 7750 3904 'm/NWRL/TMX/098/d/status',[1425002871,]806,3069000,59666,-33.836465,151.051189 'm/NWRL/TMX/098/d/SVlts',[1425002881,]810,5440995,6143 7807 4076 'm/NWRL/TMX/098/d/status',[1425002885,]810,5489000,59897,-33.836465,151.051189