내 파일은 에 있습니다 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 개체를 만드는 데 사용됩니다 . 값은 단순히 디렉터리 경로 이름의 기본 이름이고 온도는 디렉터리의 파일에서 읽혀집니다.ID
temp
ID
temperature
그런 다음 이러한 개별 JSON 객체는 두 번째 프로세스로 파이프되어 jq
( ) 옵션을 사용하여 해당 객체의 배열을 생성합니다. 또한 각 객체의 요소를 문자열에서 숫자로 변환하고 1000으로 나누어 이를 수정합니다(이것은 귀하가 말한 적이 없으므로 추측합니다).-s
--slurp
temp
같은 일이지만 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-output
jq
[{"ID":"28-00000cbece90","temp":21.812},{"ID":"28-00000cbece91","temp":21.812}]