속도 테스트 출력에서 ​​여러 문자열에 대한 grep

속도 테스트 출력에서 ​​여러 문자열에 대한 grep

나는 그것을 사용하고 있다속도 테스트BASH 스크립트의 CLI를 실행하고 한 줄만 사용하여 출력을 얻으려고 합니다(가능한 경우).

Speedtest의 일반적인 출력:

Speedtest by Ookla

  Server: (censored)
     ISP: (censored)
 Latency:    93.85 ms   (222.66 ms jitter)
Download:    85.75 Mbps (data used: 134.8 MB)                               
  Upload:     5.68 Mbps (data used: 6.2 MB)   

대기 시간, 다운로드 속도, 업로드 속도 및 지터를 얻고 싶습니다.

Most ideal format: 
Download Speed: xx Mbps
Upload Speed: xx Mbps
Latency: xx ms
Jitter: xx ms

내 현재 테스트 코드는 2개의 낭비된 명령문을 사용합니다.

dl_speed=`speedtest | grep "Download: " | head -2 | tail -1 | awk {'print$2'} | cut -f1 -d:`

ul_speed=`speedtest | grep "Upload: " | head -2 | tail -1 | awk {'print$2'} | cut -f1 -d:`

echo "Download Speed: $dl_speed Mbps"
echo "Upload Speed: $ul_speed Mbps"

답변1

GNU awk를 사용하세요. 최소한 공백과 (필드 구분 기호를 사용했습니다. 이것을 speedtest명령에 추가하십시오.

| awk 'BEGIN{ FS=" +|\\(" };
       /Download/{ dow=$3 " " $4 };
       /Upload/  { upl=$3 " " $4 };
       /Latency/ { lat=$3 " " $4 };
       /jitter/  { jit=$6 " " $7 };
       END{
         print "Download Speed:", dow;
         print "Upload Speed:", upl;
         print "Latency:", lat;
         print "Jitter:", jit
       }'

표준 출력으로 출력:

다운로드 속도: 85.75Mbps
업로드 속도: 5.68Mbps
지연 시간: 93.85ms
지터: 222.66ms

답변2

speedtest | tr -d '(:'  | \
  awk '/Download|Upload/ {print $1 " Speed: ",$2,$3} 
       /Latency/ {print $1":",$2,$3} 
       /jitter/ {print "Jitter:",$4,$5}'

주어진

Latency: 93.85 ms
Jitter: 222.66 ms
Download Speed:  85.75 Mbps
Upload Speed:  5.68 Mbps

답변3

내가 액세스할 수 있는 이 도구( )의 버전 speedtest-cli(Ubuntu의 경우 2.1.2, macOS 및 OpenBSD의 경우 2.1.3)은 표시된 정확한 출력 형식을 제공하지 않습니다. 그러나 올바른 명령줄 옵션이 제공되면 CSV 및 JSON 형식으로 출력을 제공합니다.

이는 다음과 같이 JSON 형식의 출력에서 ​​필요한 데이터를 쉽게 얻을 수 있음을 의미합니다.

speedtest-cli --json | 
jq -r '[
    ["Download (Mbps):", .download/1e6],
    ["Upload (Mbps):", .upload/1e6],
    ["Latency (ms):", .server.latency]
] | map(@tsv)[]'

이는 하위 객체에서 .download키의 값과 값을 선택합니다 .upload. 다운로드 및 업로드 속도 값은 비트/초 단위이므로 적절하게 조정해야 합니다. 값은 헤더와 함께 탭으로 구분된 형식으로 출력됩니다..latency.server

출력 예:

Download (Mbps):        88.32191644148061
Upload (Mbps):  93.34628783248138
Latency (ms):   10.756

내가 가지고 있는 이 도구의 변형에는 어떤 출력 모드에서도 출력 "지터"가 없는 것 같습니다.


참고로 전체 JSON 출력은 다음과 같습니다.

{
  "download": 88321916.4414806,
  "upload": 93346287.83248138,
  "ping": 10.756,
  "server": {
    "url": "http://somehost.example.com:8080/speedtest/upload.php",
    "lat": "XXX",
    "lon": "YYY",
    "name": "Thetown",
    "country": "Thecountry",
    "cc": "ZZ",
    "sponsor": "Company",
    "id": "XYZ",
    "host": "somehost.example.com:8080",
    "d": 156.5033515123062,
    "latency": 10.756
  },
  "timestamp": "2021-12-04T20:12:20.816506Z",
  "bytes_sent": 119447552,
  "bytes_received": 110800036,
  "share": null,
  "client": {
    "ip": "my-public-ip-number",
    "lat": "XX",
    "lon": "YY",
    "isp": "provider",
    "isprating": "3.7",
    "rating": "0",
    "ispdlavg": "0",
    "ispulavg": "0",
    "loggedin": "0",
    "country": "ZZ"
  }
}

speedtest-cli다음을 사용하여 CSV 출력을 구문 분석할 수도 있습니다.csvkit도구:

{ speedtest-cli --csv-header; speedtest-cli --csv; } |
csvcut -c Download,Upload,Ping | csvlook

먼저 CSV 헤더를 출력합니다 speedtest-cli(이유가 무엇이든 별도로 수행해야 함). 그런 다음 속도 테스트를 실행하고 및 열(CSV로 결과를 얻을 때 "지연" 열이 없는 것 같음) Download을 추출 하고 결과 CSV를 마크다운 형식의 테이블로 다시 형식화합니다.UploadPing

결과는 다음과 같습니다.

|        Download |          Upload |   Ping |
| --------------- | --------------- | ------ |
| 88,649,466.475… | 93,164,137.292… | 10.193 |

렌더링하면 다음과 같습니다.

다운로드 업로드 평평한
88,649,466.475… 93,164,137.292… 10.193

처음 두 열의 숫자는 비트/초 단위입니다.

답변4

모든 Unix 시스템의 모든 쉘에서 awk를 사용하고 데이터 이름을 인쇄해야 할 때 코드에서 한 번만 사용하십시오. 따라서 추가 prt()명령문을 쉽게 추가하고, 수정하고, 테스트 및/또는 이를 수행하거나 유사한 다른 명령을 재정렬할 수 있습니다. 코드를 전혀 변경하지 않고 형식화된 데이터:

$ speedtest | awk '
    {
        gsub(/[:()]/,"")
        tag2val[tolower($1)] = $2 " " $3
        tag2val[tolower($6)] = $4 " " $5
    }
    END {
        prt("Download Speed")
        prt("Upload Speed")
        prt("Latency")
        prt("Jitter")
    }
    function prt(name,      tag) {
        tag = tolower(name)
        sub(/ .*/,"",tag)
        print name ":" OFS tag2val[tag]
    }
'
Download Speed: 85.75 Mbps
Upload Speed: 5.68 Mbps
Latency: 93.85 ms
Jitter: 222.66 ms

관련 정보