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
추가하고 각 공백을 쉼표로 바꾼 다음 첫 번째 또는 두 번째 타임스탬프, 따옴표 사이의 값과 두 번째 타임스탬프 뒤의 값만 유지하여 그룹화하고 마지막으로 결과를 인쇄합니다.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를 사용하고 있습니다.
나는 두 줄을 연결하고 날짜를 추가하는 간단한 방법으로 while read 줄을 사용하고 있습니다. 이는 sed 또는 tr을 사용하여 가능하지만 약간의 작업이 필요할 수 있습니다(sed의 다른 버전).
mosquitto_sub에 대한 호출을 완전히 이해하지 못하므로 문자열이 파이프될 때만 솔루션을 표시합니다.
- 거기서 무엇을 해야 하나요
#
?
따옴표가 없으면 주석의 시작 부분이어야 합니다. - 문자열을 찾을 때 숫자가 포함된 줄을 얻는 방법은 무엇입니까?
이 숫자가 stderr에 기록됩니까? grep 을 사용하여 표준 출력으로 리디렉션한 후에는 건너뜁니다2>&1
.