
mosquitto_sub -d -t +/#
Ubuntu端末から入力してMQTTストリームにアクセスします。
リアルタイムMQTTストリームの実際の出力は次のとおりです。
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
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/SVlts', ... (26 bytes))
806,3040421,7549 7750 3904
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/status', ... (39 bytes))
806,3069000,59666,-33.836465,151.051189
Sending PINGREQ
Received PINGRESP
Sending PINGREQ
Received PINGRESP
Sending PINGREQ
Received PINGRESP
Sending PINGREQ
Received PINGRESP
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/SVlts', ... (26 bytes))
810,5440995,6143 7807 4076
Sending PINGREQ
Received PINGRESP
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/status', ... (39 bytes))
810,5489000,59897,-33.836465,151.051189
Sending PINGREQ
Received PINGRESP
次のPUBLISHは、車両がGSM / 3Gタワーから送受信したときにのみストリームに表示されるため、いつ表示されるかを予測できません。
mosquitto_sub -d -t +/# 2> >(grep PUBLISH)
フィルタリングするためにそれを含む行のみを許可するものを追加するので、PUBLISH
出力は次のようになります。
Received PUBLISH (d0, q0, r0, m0, 'm/gf/TMX6BP/075/d/status', ... (38 bytes))
86,637999,164563,-33.836465,151.051189
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/SVlts', ... (26 bytes))
806,3040421,7549 7750 3904
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/status', ... (39 bytes))
806,3069000,59666,-33.836465,151.051189
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
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/SVlts', ... (26 bytes))
806,3640483,7463 7721 3933
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/status', ... (39 bytes))
806,3674000,59676,-33.836465,151.051189
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/SVlts', ... (26 bytes))
806,4240543,7291 7750 3933
Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/status', ... (39 bytes))
806,4279000,59687,-33.836465,151.051189
Received PUBLISH (d0, q0, r0, m0, 'm/gf/MXE/065/d/SVlts', ... (25 bytes))
455,24715,28041 28041 967
何かを受け取るたびにいくつかのフィールドを削除してタイムスタンプを追加するにはどうすればよいですか?試してみましsed
たが運がありませんでした。私は入った、$ mosquitto_sub -d -t +/# 2< <(grep PUBLISH) 2< <(sed "s/^/
date
/")$ mosquitto_sub -d -t +/# 2< <(grep PUBLISH) 2< <(sed "s/^/$
date`/")
尋ねる:上記のライブソースの出力が次のように端末への入力をどのように変更できますか?
[timestamp],m,gf,TMX6BP,075,d,status,86,637999,164563,-33.836465,151.051189
[timestamp],m,NWRL,TMX,098,d,SVlts,806,3040421,7549 7750 3904
[timestamp],m,NWRL,TMX,098,d,status,806,3069000,59666,-33.836465,151.051189
[timestamp],m,gf,TMX6BP,075,d,SVlts,86,1224830,27610 27869 17565
[timestamp],m,gf,TMX6BP,075,d,status,86,1243000,164573,-33.836465,151.051189
[timestamp],m,NWRL,TMX,098,d,SVlts,806,3640483,7463 7721 3933
[timestamp],m,NWRL,TMX,098,d,status,806,3674000,59676,-33.836465,151.051189
[timestamp],m,NWRL,TMX,098,d,SVlts,806,4240543,7291 7750 3933
[timestamp],m,NWRL,TMX,098,d,status,806,4279000,59687,-33.836465,151.051189
[timestamp],m,gf,MXE,065,d,SVlts,455,24715,28041 28041 967
考えられる解決策(今後の参照用):
mosquitto_sub -d -t +/# 2> >(sed -n "s|.*\('.*',\).*|\1|p") | sed "N;s/\n/ /;s/$/ $(date)/"
出力の使用は次のとおりです。
0 810,5440995,6143 7807 4076 Wed Feb 25 23:23:51 UTC 2015 810,5489000,59897,-33.836465,151.051189 810,6041055,7606 7693 4076 Wed Feb 25 23:23:51 UTC 2015
mosquitto_sub -d -t +/# 2> >(grep PUBLISH) | sed "N;s/\n/ /;s/$/ $(date)/"
端末コマンドを使用した出力は次のとおりです。
817,3069000,60045,-33.836465,151.051189 609,24570,27553 27553 955 Thu Feb 26 00:06:26 UTC 2015
mosquitto_sub -d -t +/# 2>&1 | sed -n "/PUBLISH/{s|.*\('.*',\).*|\1|;N;s/\n/ /;s/$/ $(date)/;p}"
出力の使用は
'm/gf/MX3/122/d/status', 610,33000,28162,-33.836465,151.051189 Thu Feb 26 01:18:17 UTC 2015
答え1
はい、かなり混乱しています。とにかく...アプリケーションの出力からの出力はと
mosquitto_sub -d -t +/# 2> >(grep PUBLISH)
両方に行くようです(そうでなければ、出力から一致する行だけを取得する必要があります)。デバッグメッセージ(および)をに印刷し、実際のデータ()をに印刷します。 stderr
stdout
PUBLISH
Sending...
Received...
stderr
810,5440995,6143...
stdout
明らかにカンマ区切りの値が必要なので、行のタイムスタンプを一致させる必要がある場合は、次のことを試すことができますPUBLISH
。
mosquitto_sub -d -t +/# 2>&1 | xargs -d$'\n' -L1 sh -c 'date "+%s,$0"' | \
sed -n "/PUBLISH/{N;s|[ /]|,|g;s|^\([^,]*,\)[^']*'\([^']*\)',.*\n[^,]*,\(.*\)|\1\2,\3|;p}"
または、次の行のタイムスタンプが必要な場合:
mosquitto_sub -d -t +/# 2>&1 | xargs -d$'\n' -L1 sh -c 'date "+%s,$0"' | \
sed -n "/PUBLISH/{N;s|[ /]|,|g;s|^[^,]*,[^']*'\([^']*\)',.*\n\([^,]*,\)\(.*\)|\2\1,\3|;p}"
2>&1
stderr
にリダイレクトstdout
してから出力にパイプし、xargs
各行を次のコマンドの引数として渡しますsh -c 'date "+%s,$0"'
。これにより、各行の前にタイムスタンプ+カンマが付きます。例:
[timestamp],Sending PINGREQ
[timestamp],Received PINGRESP
[timestamp],Received PUBLISH (d0, q0, r0, m0, 'm/NWRL/TMX/098/d/status', ... (39 bytes))
[timestamp],871,40114,4536 4536 323
その後、パイプを介してsed
自動印刷(-n
)を抑制します。
一致する各行に追加の行をPUBLISH
追加し、各スペースをコンマで置き換えてから、最初または2番目のタイムスタンプ、引用符の間の値、および2番目のタイムスタンプの後の値のみを保持してグループ化し、最後に結果を印刷します。N
/
[timestamp],m,NWRL,TMX,098,d,status,871,40114,4536,4536,323
答え2
bash / ksh環境で蚊をシミュレートした結果、次のことがわかりました。
stub_mosquitto |
sed -e 's/.*m0, //' -e 's/, .*bytes))//' | while read line; do
if [[ "${line}" = \'* ]]; then
echo -n "${line}, "
else
echo "${line}, $(date)"
fi
done
ここでは興味深い部分を切り取るためにsedを使用しています。
私は2行を連結して日付を追加する簡単な方法でwhile read行を使用しています。これはsedまたはtrを使用して可能ですが、少しの作業が必要になる場合があります(sedの他のバージョン)。
mosquitto_subへの呼び出しを完全に理解していないため、文字列がパイプされている場合にのみソリューションを表示します。
- そこで何をすべきですか
#
?
引用符がない場合は、コメントの先頭にする必要があります。 - 文字列を見つけるときに数字を含む行を取得するには?
この数字はstderrに記録されますか? grepを使用して標準出力にリダイレクトした後はスキップします2>&1
。