Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何提取 result.csv 测速结果文件中的最快的第一个 IP #34

Closed
lost1984 opened this issue Jan 11, 2021 · 10 comments
Closed
Labels
工具教程 辅助工具 或 技巧教程

Comments

@lost1984
Copy link

lost1984 commented Jan 11, 2021

如题,Linux 下我是这样操作的,可以提取到第二行的 IP,然后在 ddns 或者 host。

绝对路径:

# 运行测速
/root/cf/CloudflareST -f /root/cf/ip.txt  -o /root/cf/result.csv

# 获取测速结果第一个 IP
# 输出到文件:
sed -n "2,1p" /root/cf/result.csv | awk -F, '{print $1}' > /root/cf/best_ip.txt
# 赋值到变量 BEST_IP 中:
BEST_IP=$(sed -n "2,1p" /root/cf/result.csv | awk -F, '{print $1}')
# 使用 ${BEST_IP} 来调用变量,如 echo ${BEST_IP} 这样

如果当前位于 CloudflareST 程序所在目录下,则看下面的相对路径命令。

相对路径:

# 运行测速
./CloudflareST

# 获取测速结果第一个 IP
# 输出到文件:
sed -n "2,1p" result.csv | awk -F, '{print $1}' > best_ip.txt
# 赋值到变量 BEST_IP 中:
BEST_IP=$(sed -n "2,1p" result.csv | awk -F, '{print $1}')
# 使用 ${BEST_IP} 来调用变量,如 echo ${BEST_IP} 这样

大家有好的写法也可以贴出来。
现在请问一下,Windows 下如何用默认的命令写类似批处理出来?

@XIU2
Copy link
Owner

XIU2 commented Jan 12, 2021

我对 Windows 批处理脚本也不熟,查了查,简单写了个批处理脚本。

批处理文件示例

右键菜单新建一个 新建文本文档.txt,将下方内容写入文件,并重命名为 CloudflareST.bat (主要是改后缀,文件名随意)

@echo off
Setlocal Enabledelayedexpansion
CloudflareST.exe -p 0
for /f "tokens=1 delims=," %%i in (result.csv) do (
    Set /a n+=1 
    If !n!==2 Echo %%i>best_ip.txt & goto :END
    :: 如果是赋值到变量 bestip 那么把上面这行改成下面这样(使用 %bestip% 来调用该变量,如 echo %bestip% 这样):
    :: SET bestip=%%i & goto :END
)
:END

双击运行 CloudflareST.bat 后,会自动开始测速,完成后获取测速结果文件中第一个 IP(最快的)并写出到 best_ip.txt 文件。

记得把该批处理文件 CloudflareST.batCloudflareST.exe 放在一个目录下


解释说明

  • 加上参数 -p 0 是为了避免测速完成后,需要手动回车退出(即禁用了软件直接显示结果)。
  • 以上批处理只是一个示例,大家可以按需修改,比如在 CloudflareST.exe 后面添加其他参数。

@XIU2 XIU2 changed the title win下如何提取到第二行的IP Windows 下如何提取 result.csv 测速结果文件中的最快的第一个 IP Jan 12, 2021
@XIU2 XIU2 added the 工具教程 辅助工具 或 技巧教程 label Jan 13, 2021
@XIU2 XIU2 changed the title Windows 下如何提取 result.csv 测速结果文件中的最快的第一个 IP 如何提取 result.csv 测速结果文件中的最快的第一个 IP Jan 13, 2021
@xwgodxwgod
Copy link

如果得到的结果速度不达到指定速度,就重新进行测速怎么写批处理?

@XIU2
Copy link
Owner

XIU2 commented Dec 31, 2021

@xwgodxwgod #143

@xwgodxwgod
Copy link

xwgodxwgod commented Dec 31, 2021

@XIU2 场景不同

比如我的宽带是50M的,期待下载速度为5M/S
但是多半获取到的结果是2M/S的结果,这时候获取到的IP是有存在的,
换到上面的场景得重复打开结果后对比速度后再次跑程序,
这样只能算半人工化
下面是:bettercloudflareip里面的写法,我能力有限没法整合,求协助

:bettercloudflareip
set /a tasknum=50
set /a bandwidth=100
set /p bandwidth=请设置期望的带宽大小(默认%bandwidth%,单位 Mbps):
set /p tasknum=请设置RTT测试进程数(默认%tasknum%,最大100):
if %tasknum% EQU 0 (set /a tasknum=50&echo 进程数不能为0,自动设置为默认值)
if %tasknum% GTR 100 (set /a tasknum=100&echo 超过最大进程限制,自动设置为最大值)
set /a speed=bandwidth*128
set /a startH=%time:~0,2%
if %time:~3,1% EQU 0 (set /a startM=%time:~4,1%) else (set /a startM=%time:~3,2%)
if %time:~6,1% EQU 0 (set /a startS=%time:~7,1%) else (set /a startS=%time:~6,2%)
call :start
exit

备注:bettercloudflareip自从被洁|癖人士举报作者改版后,一晚上都获取不到想要的优质CDN IP了

@XIU2
Copy link
Owner

XIU2 commented Dec 31, 2021

@xwgodxwgod
你加上 -sl 5 参数(下载速度下限)即可,这样会忽略低于 5MB/s 的 IP。
直到找到指定数量的 IP 才会停止(-dn 参数,默认 10 个)。
因此建议同时加上 -tl 参数(延迟上限),延迟太高的就没必要测了,也避免下载测速队列太多一直测速下去(毕竟延迟越高,下载速度越快的就越少)。
如果你不是移动用户的话,要避免遇到假蔷 IP 的话,可以加上 -tll 90 参数,过滤掉低于 90ms 延迟的 IP(电信联通正常情况下不可能遇到低于 90ms 的 IP,因此基本上都是被假蔷的 IP)

因此是建议同时组合使用 -sl 5 -tl 250 -tll 90 -dn 5
即先延迟测速,筛选掉延迟低于 90ms 高于 250ms 的 IP,然后对这些 IP 下载测速,筛选掉速度低于 5MB/s 的 IP,最后凑够 5 个完全满足条件的 IP 就会停止。

如果下载测速把队列里的 IP 都测速了一遍还是没有找到哪怕 1 个 IP,就会输出 0 个 IP,这时候就正好用的上我前面发的 #143 ,这时候就会重新进行测速,一直循环下去,直到找到最少 1 个完全满足条件的 IP 才会停止脚本。

@xwgodxwgod
Copy link

@XIU2 在指定文件为txt文件的前提下,额外输出一个带测速下载速度的结果文件该如何增加代码?
比如凑够了5个满足条件的IP,txt文件记录里面就和CSV文件里面的内容差不多,IP然后后面是下载速度
类似这种
xxx.xxx.xxx.xxx 2.5M/s
xxx.xxx.xxx.xxx 1.5M/s

@XIU2
Copy link
Owner

XIU2 commented Dec 31, 2021

@xwgodxwgod 这个就需要自己去格式化了。
CloudflareST 下载测速一切完成后,脚本读入 result.csv 文件内容,格式化并写出到 x.txt 中。
具体格式化代码,我就不清楚了(大概原理应该是:循环读取每行,用 , 分割列,提取第一列和最后一列,组合到一起),我对 bat 脚本不熟,我写的那两个也都是查来查去东拼西凑的。

@xwgodxwgod
Copy link

@xwgodxwgod 这个就需要自己去格式化了。 CloudflareST 下载测速一切完成后,脚本读入 result.csv 文件内容,格式化并写出到 x.txt 中。 具体格式化代码,我就不清楚了(大概原理应该是:循环读取每行,用 , 分割列,提取第一列和最后一列,组合到一起),我对 bat 脚本不熟,我写的那两个也都是查来查去东拼西凑的。

非常感谢,我再琢磨一下

@XIU2
Copy link
Owner

XIU2 commented Dec 31, 2021

@xwgodxwgod 不着急,我正好闲的没事研究下,快完成了大概,一会把现成脚本发出来。

@XIU2
Copy link
Owner

XIU2 commented Dec 31, 2021

@xwgodxwgod 试了几下应该没啥问题了。

:: 提取 result.csv 文件中的第 1 和 6 列(对应 i 和 j 变量)
(
    FOR /f "tokens=1,6 delims=," %%i in (result.csv) do (
        SET /a n+=1 
        :: 跳过第一行(表头文字)
        If !n! GTR 1 (
            ECHO %%i %%j MB/s
        )
    )
)>123.txt
:: 输出 [IP 速度 MB/s] 这个格式追加到 123.txt 文件末尾

从 result.csv 文件读取,格式化并写出到 123.txt 文件中。

result.csv 文件示例:

IP 地址,已发送,已接收,丢包率,平均延迟,下载速度 (MB/s)
1.1.1.1,10,10,0.00,209.01,55.00
1.1.1.2,10,10,0.00,209.16,44.00
1.1.1.3,10,10,0.00,210.56,33.00
1.1.1.4,10,10,0.00,210.59,22.00
1.1.1.5,10,10,0.00,211.13,11.00

123.txt 文件内容(即格式化后的):

1.1.1.1 55.00 MB/s 
1.1.1.2 44.00 MB/s 
1.1.1.3 33.00 MB/s 
1.1.1.4 22.00 MB/s 
1.1.1.5 11.00 MB/s 

Repository owner locked and limited conversation to collaborators Mar 1, 2023
@XIU2 XIU2 converted this issue into discussion #313 Mar 1, 2023

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
工具教程 辅助工具 或 技巧教程
Projects
None yet
Development

No branches or pull requests

3 participants