私のファイルはにあります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
このフォルダ内には2つのファイル(他の多くのファイルを含む)があります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
(2回)とシェルループを使用してください。
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オブジェクトを2番目のプロセスにパイプ処理し、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}]