하위 폴더에서 동일한 이름을 가진 파일의 내용을 가져오고 JSON 배열을 가져옵니다.

하위 폴더에서 동일한 이름을 가진 파일의 내용을 가져오고 JSON 배열을 가져옵니다.

내 파일은 에 있습니다 28-.

온도를 측정하는 데 사용되는 단선 버스 센서입니다. Raspberry는 SPI 인터페이스를 통해 이를 식별합니다. 각 감지기는 ID(28-로 시작)를 가지며 RB는 감지기의 ID로 이름이 지정된 각 센서에 대한 트리를 생성합니다.

ls /sys/bus/w1/devices/w1_bus_master1 -1
28-00000cbece94/
28-00000cbeeca3/
28-00000cbeedf6/
28-00000cbf87ba/
...

temperature이 폴더 안에는 두 개의 파일(다른 많은 파일 포함) 이 있습니다 name.

name는 폴더 이름이기도 한 프로브 ID이며 temperature(…놀랍게도) 온도입니다.

여기서 ID는 폴더 이름과 파일 콘텐츠입니다.

cat /sys/bus/w1/devices/w1_bus_master1/28-00000cc002fa/name 
28-00000cc002fa

온도는

cat /sys/bus/w1/devices/w1_bus_master1/28-00000cc002fa/temperature 
21812

JSON 개체 배열을 생성하는 스크립트를 작성하거나 일련의 bash 명령을 작성하고 싶습니다. 예를 들어 [ {"ID": "28-00000cbece94", "temp": 24.712}, {"ID": "28-00000cbeeca3", "temp": 24.735}, <so on> ] awk가 포함되어야 한다고 생각하지만 -exec를 찾을 수도 있지만 간단한 grep+cat 또는 트리를 찾을 수도 있습니다. 그렇지만. ..

도움이 필요하세요?

미리 감사드립니다

답변1

jq(두 번) 및 쉘 루프를 사용하십시오 .

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
    jq -n \
        --arg ID "$(basename "$pathname")" \
        --arg temp "$(cat "$pathname"/temperature)" \
        '{ ID: $ID, temp: $temp }'
done |
jq -s '. | map( .temp = (.temp | tonumber / 1000) )'

루프는 질문에서 언급한 디렉토리 로 28-시작하는 디렉토리에 해당하는 경로 이름을 반복합니다. 이 루프는 요소와 요소 jq로 구성된 각 디렉터리에 대한 JSON 개체를 만드는 데 사용됩니다 . 값은 단순히 디렉터리 경로 이름의 기본 이름이고 온도는 디렉터리의 파일에서 읽혀집니다.IDtempIDtemperature

그런 다음 이러한 개별 JSON 객체는 두 번째 프로세스로 파이프되어 jq( ) 옵션을 사용하여 해당 객체의 배열을 생성합니다. 또한 각 객체의 요소를 문자열에서 숫자로 변환하고 1000으로 나누어 이를 수정합니다(이것은 귀하가 말한 적이 없으므로 추측합니다).-s--slurptemp

같은 일이지만 jo루프 내부에서 약간 더 편리한 유틸리티를 사용합니다.

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
    jo  ID="$(basename "$pathname")" \
        temp="$(cat "$pathname"/temperature)"
done |
jq -s '. | map( .temp /= 1000 )'

또한 유틸리티 jo는 이것이 temp숫자임을 감지하므로 나중에 문자열에서 변환할 필요가 없습니다.

두 루프 모두 "예쁘게 인쇄된" JSON을 생성합니다.

[
  {
    "ID": "28-00000cbece90",
    "temp": 21.812
  },
  {
    "ID": "28-00000cbece91",
    "temp": 21.812
  }
]

간결한 출력을 생성하려면 끝에 -c( ) 옵션을 추가하십시오 .--compact-outputjq

[{"ID":"28-00000cbece90","temp":21.812},{"ID":"28-00000cbece91","temp":21.812}]

관련 정보