캐리지 리턴을 제거하고, 타임스탬프를 추가하고, 라이브 MQTT 소스의 일부 데이터를 무시하는 방법

캐리지 리턴을 제거하고, 타임스탬프를 추가하고, 라이브 MQTT 소스의 일부 데이터를 무시하는 방법

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)
둘 다로 가는 것처럼 보입니다 (그렇지 않으면 출력에서 ​​일치하는 행만 얻어야 합니다 ). 디버그 메시지( 및 )를 에 인쇄 하고 실제 데이터( )를 에 인쇄합니다 . stderrstdoutPUBLISHSending...Received...stderr810,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>&1stderr로 리디렉션 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.

관련 정보