
そこで、Ookla の公式スピードテスト クライアントを実行して CSV ファイルに出力すると、出力にタイムスタンプ フィールドがないことに気が付きました。JSON にはありますが、私は jq に詳しくないので、JSON 出力を CSV に変換しても役に立ちません。
出力を取得して、先頭にタイムスタンプが付いたファイルにパイプする方法はありますか?
これはJSONとして出力されたものである
{"type":"result","timestamp":"2021-07-22T16:14:17Z","ping":{"jitter":0.035999999999999997,"latency":3.9399999999999999},"download":{"bandwidth":117078051,"bytes":884657048,"elapsed":7601},"upload":{"bandwidth":117029963,"bytes":467614102,"elapsed":4006},"packetLoss":0,"isp":"CenturyLink","interface":{"internalIp":"192.168.0.35","name":"eth0","macAddr":"E4:5F:01:2F:1D:39","isVpn":false,"externalIp":"71.214.44.165"},"server":{"id":10161,"name":"CenturyLink","location":"Orlando, FL","country":"United States","host":"orlando.speedtest.centurylink.net","port":8080,"ip":"205.171.98.14"},"result":{"id":"64657421-d008-4053-9832-2d1a9b01b649","url":"https://www.speedtest.net/result/c/64657421-d008-4053-9832-2d1a9b01b649"}}
これはCSVの出力です(ヘッダー付き)
"server name","server id","latency","jitter","packet loss","download","upload","download bytes","upload bytes","share url"
"The Villages - The Villages, FL","25753","33.338","0.302","0","117318528","112406990","1488776432","1053747984","https://www.speedtest.net/result/c/8bbb92b8-880d-4021-b5e5-c90206862d18"
"CenturyLink - Orlando, FL","10161","4.013","0.399","0","76816660","112435444","1158108878","473391675","https://www.speedtest.net/result/c/17508892-6fc7-4616-84bb-810d314c50af"
"CenturyLink - Orlando, FL","10161","3.533","0.407","0","115293486","97552291","1002647576","574510787","https://www.speedtest.net/result/c/9913a846-1fbf-4d69-a1e9-27430914d397"
私がやろうとしているのは、JSON によって出力される追加されたタイムスタンプ データを CSV 形式に変換して、さらに処理できるようにすることです。
答え1
このワンライナーはあなたが望むものを出力します:
<JSON> | jq -r '.timestamp, .server.name, .server.id, .pi ng.latency, .ping.jitter, .packetLoss, .download.bandwidth, .upload.bandwidth, .download.bytes, .upload.bytes, .result.url' | tr '\n' ',' | sed '$s/,$/\n/' | tee -a <CSV File>
サンプル JSON を使用して、必要なすべての要素を次のように抽出しましたjq -r
。
.timestamp
.server.name
.server.id
.ping.latency
.ping.jitter
.packetLoss
.download.bandwidth
.upload.bandwidth
.download.bytes
.upload.bytes
.result.url
次に、結果を にパイプしてtr `\n' ','
コンマ区切りのリストを作成し、tr
の結果を にパイプしてsed '$s/,$/\n/'
末尾のコンマを削除しました。
結果は次のようになります。
2021-07-22T16:14:17Z,CenturyLink,10161,3.94,0.036,0,117078051,117029963,884657048,467614102,https://www.speedtest.net/result/c/64657421-d008-4053-9832-2d1a9b01b649
答え2
csv ファイルを直接実行しようとしている場合は、独自に調査した後、次の操作を実行しました。
#!/bin/sh
now=\"$(date +"%Y-%m-%d %H:%M:%S")\",
ookla -c http://www.speedtest.net/api/embed/vz0azjarf5enop8a/config -f csv | grep -v download | sed "s/^/$now/" >> /mnt/merlin/speedtest.csv
最も適した形式で日付を保存します。生成されたデータに合わせて引用符とカンマも追加しました。これは後で使用します。
ookla 出力を実行してgrep
ヘッダー行を削除し、sed
行の先頭に作成したタイムスタンプを挿入しました。次にこれを csv に追加します。ルーターで cron ジョブとして実行しています。お役に立てば幸いです。