
Итак, при запуске официального клиента speedtest от 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 на своем маршрутизаторе. Надеюсь, это поможет.