賞金將在 3 天后到期。此問題的答案有資格獲得 50聲望賞金。 Waddah Shamroukh正在從有信譽的來源尋找答案。
我使用以下腳本來獲取特定網站的平均回應時間。它作業得很好。我只需要轉換回應中的一些值,例如time_total,我想以毫秒為單位查看它,并以 KB 格式查看size_download。在我分享平均回應時間的命令結束時,我還想以毫秒為單位列印它。非常感謝任何幫助。
for ((i=1;i<=50;i )); do curl -w 'Return Code: %{http_code}; Bytes Received: %{size_download}; Response Time: %{time_total}\n' "https://www.google.com" -m 2 -o /dev/null -s; done |tee /dev/tty|awk '{ sum = $NF; n } END { If (n > 0); print "Average Response Time =",sum /n;}'
uj5u.com熱心網友回復:
您可以將 curl 輸出通過管道傳輸awk
并按照您的需要對其進行格式化,如下所示:
curl -w 'Return Code: %{http_code}; Bytes Received: %{size_download}; Response Time: %{time_total}\n' "https://www.google.com" -m 2 -o /dev/null -s | awk '{printf "Return Code: %d; KiB Received: %f; Response Time(ms): %f\n", $3, $6/1024, $9*1000}'
所以oneliner如下:
for ((i=1;i<=50;i )); do curl -w 'Return Code: %{http_code}; Bytes Received: %{size_download}; Response Time: %{time_total}\n' "https://www.google.com" -m 2 -o /dev/null -s | awk '{printf "Return Code: %d; KiB Received: %f; Response Time(ms): %f\n", $3, $6/1024, $9*1000}'; done | tee /dev/tty |awk '{ sum = $NF; n } END { If (n > 0); print "Average Response Time =",sum /n;}'
您還可以通過 putg 根據需要格式化數字,例如 %.2f 表示 2 位小數精度或 %d 表示整數...
uj5u.com熱心網友回復:
三個答案在這里...
因為這個問題被標記殼(不是 bash),這里有兩種不同的方法,使用awk
orshell
和bc
.
用于awk
處理輸出和計算平均值
像做分叉一樣sommecommand | awk
是資源殺手,我更喜歡awk
只運行一次,在下面完成整個格式化輸出作業awk
:
iter=10
for ((i=iter;i--;));do
curl -w '%{http_code} %{size_download} %{time_total}\n' \
"https://www.google.com" -m 2 -o /dev/null -s
sleep .02
done | awk -v iter=$iter '
BEGIN {
ttim=0;tsiz=0;
printf " %-3s %8s s s\n","Res","Size","Time","Rate"
};
{
printf " %-3s %7.2fK %9.2fms %7.2fK/s\n", \
$1, $2/1024,$3*1000,$2/$3/1024;
tsiz =$2;ttim =$3;
};
END {
printf "Tot %7.2fK %9.2fms\nAvg %7.2fK %9.2fms %7.2fK/s\n", \
tsiz/1024,ttim*1000, tsiz/iter/1024,ttim/iter*1000,tsiz/ttim/1024;
}'
可能產生:
Res Size Time Rate
200 14.61K 128.48ms 113.71K/s
200 14.75K 131.06ms 112.52K/s
200 14.73K 131.71ms 111.85K/s
200 14.72K 130.24ms 113.05K/s
200 14.66K 134.68ms 108.86K/s
200 14.69K 131.39ms 111.79K/s
200 14.63K 131.15ms 111.53K/s
200 14.70K 126.26ms 116.42K/s
200 14.71K 129.08ms 113.98K/s
200 14.68K 131.23ms 111.86K/s
Tot 146.88K 1305.28ms
Avg 14.69K 130.53ms 112.53K/s
使用平均值作業殼
由于 shell 不適用于浮點數,因此您必須使用bc
或其他子行程來解決此操作。
由于分叉var=$(echo '3*4'|bc)
是資源殺手,我更喜歡bc
只運行一次,作為后臺行程。這樣做的一個優點是bc
可以存盤整體變數(total download
和total size
此處)。
第一部分:初始化一些變數并運行bc
宣告一些變數和numfmt
函式以bc
供進一步使用...
注意numfmt
:此函式從整數值計算人類可讀的表示,輸出兩個值
octal character
b
,K
,M
,G
,P
和T
的八進制值floating number
從提交的值除以 1024 的冪
八進制的字符可以printf '%b' \\$value
在shell下輸出。
#!/bin/sh
target=${1:-https://www.google.com}
iter=${2:-10}
delay=${3:-.02}
tempdir=$(mktemp -d)
bcin="$tempdir/bcin"; bcout="$tempdir/bcout"
mkfifo "$bcin" "$bcout"
exec 3<>"$bcin"; exec 4<>"$bcout"
rm "$bcin" "$bcout" && rmdir "$tempdir"
bc -l <&3 >&4 &
mBc() { echo >&3 "$2"; read -r $1 <&4 ;}
cat >&3 <<EOInitBc
unit[0]=142;unit[1]=113;unit[2]=115;unit[3]=107;unit[4]=124;unit[5]=120
define void numfmt (s) {
if (s==0) { print "0,0\n"; return;};
p=l(s)/l(1024);
scale=0;
p=p/1;
scale=20;
print unit[p]," ",s/1024^p,"\n";
};
tsiz=0;ttim=0;
EOInitBc
# read variables from curl
checkHttpRes() {
curlRes=$(
curl -sm2 -w'%{http_code} %{size_download} %{time_total}' -o/dev/null "$1"
)
cod=${curlRes%% *}
tim=${curlRes##* }
siz=${curlRes% *}
siz=${siz#* }
mBc rate "tsiz =$siz;ttim =$tim;$siz/$tim;"
mBc mtim "$tim*1000"
mBc 'hunit hsz' "numfmt($siz)"
mBc 'hurt hrat' "numfmt($rate)"
printf ' %-3s %7.2f%b %9.2fms %7.2f%b/s\n' "$cod" "$hsz" "\\$hunit" \
"$mtim" "$hrat" "\\$hurt"
}
# Last part: *main* routine
printf ' %-3s %8s s s\n' Res Size Time Rate
i="$iter"
while [ "$i" -gt 0 ];do
checkHttpRes "$target"
sleep "$delay"
i=$((i-1))
done
mBc 'hutsz htsz' "numfmt(tsiz)"
mBc 'huasz hasz' "numfmt(tsiz/$iter)"
mBc ttim "1000*ttim"
mBc atim "1000*ttim/$iter"
mBc 'huart hart' "numfmt(tsiz/ttim)"
printf 'Tot %7.2f%b %9.2fms\nAvg %7.2f%b %9.2fms %7.2f%b/s\n' \
"$htsz" "\\$hutsz" "$ttim" "$hasz" "\\$huasz" "$atim" "$hart" "\\$huart"
運行示例:
$ ./curlStat.sh http://www.google.com 10 .1
Res Size Time Rate
200 14.76K 141.84ms 104.09K/s
200 14.65K 136.21ms 107.53K/s
200 14.61K 136.74ms 106.86K/s
200 14.67K 138.08ms 106.26K/s
200 14.70K 130.56ms 112.56K/s
200 14.65K 135.72ms 107.97K/s
200 14.68K 135.28ms 108.53K/s
200 14.64K 134.20ms 109.07K/s
200 14.70K 136.32ms 107.82K/s
200 14.71K 136.19ms 108.00K/s
Tot 146.77K 1361.14ms
Avg 14.68K 136.11ms 107.83K/s
最后的:重擊
這個問題被標記噓,但for ((i=...
語法是一種bashism。所以這是一個緊湊的純 bash版本:
#!/bin/bash
target=${1:-https://www.google.com} iter=${2:-10} delay=${3:-.02}
tsz(){ local i=$(($1>((1<<50)-1)?5:$1>64#f______?4:$1>64#_____?3:$1>1048575?2:$1>
1023?1:0)) a=(b K M G T P);((i>4))&&a=(${a[@]:1})&&((i--))&&set -- $(($1>>10)) $2
local r=00$((1000*$1/(1024**i)));printf -v $2 %.2f%s ${r::-3}.${r: -3} ${a[i]};}
declare -i ttim=0 tsiz=0
checkHttpRes() { local code size time ustim hsz hrat
read -r code size time < <(
curl -sm2 -w'%{http_code} %{size_download} %{time_total}' -o/dev/null "$1"
)
printf -v ustim '%.6f' "$time"
ustim=$((10#${ustim/.}))
tsz "$size" hsz
tsz $(( size*10**7/ustim/10 )) hrat
ttim =ustim tsiz =size ustim=00$ustim
printf ' %-3s %8s %9.2fms %8s/s\n' "$code" "$hsz" \
"${ustim::-3}.${ustim: -3}" "$hrat"
}
printf ' %-3s %8s s s\n' Res Size Time Rate
for ((i=iter;i--;)) ;do
checkHttpRes "$target"
sleep "$delay"
done
tsz $tsiz htsz
ustim=00$ttim uatim=00$((ttim/iter))
tsz $((tsiz/iter)) hasz
tsz $(( tsiz*10**7/ttim/10 )) hart
printf 'Tot %8s %9.2fms\nAvg %8s %9.2fms %8s/s\n' "$htsz" \
"${ustim::-3}.${ustim: -3}" "$hasz" "${uatim::-3}.${uatim: -3}" "$hart"
沒有任何 fork to bc
nor awk
,所有操作都是使用移位整數在偽浮點中完成的。
這將產生相同的結果:
Res Size Time Rate
200 14.68K 132.79ms 110.55K/s
200 14.68K 135.59ms 108.24K/s
200 14.68K 132.31ms 110.99K/s
200 14.75K 141.66ms 104.15K/s
200 14.66K 139.90ms 104.79K/s
200 14.71K 140.07ms 105.00K/s
200 14.68K 142.74ms 102.86K/s
200 14.64K 133.42ms 109.71K/s
200 14.72K 135.62ms 108.56K/s
200 14.71K 139.16ms 105.72K/s
Tot 146.92K 1373.25ms
Avg 14.69K 137.32ms 106.98K/s
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/507060.html