Я 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