我想将ping时间绘制到特定服务器,因此我正在解析此String的输出:
[1] "PING google.de (216.58.213.195): 56 data bytes"
[2] "64 bytes from 216.58.213.195: icmp_seq=0 ttl=58 time=15.583 ms"
[3] "64 bytes from 216.58.213.195: icmp_seq=1 ttl=58 time=11.057 ms"
[4] "64 bytes from 216.58.213.195: icmp_seq=2 ttl=58 time=10.866 ms"
[5] ""
[6] "--- google.de ping statistics ---"
[7] "3 packets transmitted, 3 packets received, 0.0% packet loss"
[8] "round-trip min/avg/max/stddev = 10.866/12.502/15.583/2.180 ms"
我正在使用正则表达式并搜索' time ='和' MS'获取时间信息开始和结束的位置。然后我使用Substr来提取数字。实际上它有效,但这是我第一次尝试解析R中的字符串,我的感觉是我的解决方案可能更优雅。你可以帮帮我吗? TY
X <- system("ping -c 3 google.de",intern=TRUE)
start<-regexpr("time=",X)
end<-regexpr(" ms",X)
start<-start+5
end<-end-1
erg<-substr(X,start,end)
erg<-erg[2:4]
erg
erg<-as.numeric(erg)
hist(erg)
答案 0 :(得分:6)
我们可以使用str_extract
来提取数字
library(stringr)
na.omit(as.numeric(str_extract(X, '(?<=time=)[0-9.]+(?=\\s*ms)')))
#[1] 15.583 11.057 10.866
X <- c("PING google.de (216.58.213.195): 56 data bytes",
"64 bytes from 216.58.213.195: icmp_seq=0 ttl=58 time=15.583 ms",
"64 bytes from 216.58.213.195: icmp_seq=1 ttl=58 time=11.057 ms",
"64 bytes from 216.58.213.195: icmp_seq=2 ttl=58 time=10.866 ms",
"", "--- google.de ping statistics ---",
"3 packets transmitted, 3 packets received, 0.0% packet loss",
"round-trip min/avg/max/stddev = 10.866/12.502/15.583/2.180 ms")
答案 1 :(得分:4)
使用您当前的向量b
,您可以尝试X
获取相关的行,然后grep()
来获取时间。以下数字与您的数字不同,因为我运行代码的第一行来指定gsub()
。
X
但是,由于您已经通过tms <- grep("time=", X, fixed = TRUE, value = TRUE)
as.numeric(gsub(".*time=(\\d+.?\\d+).*", "\\1", tms))
# [1] 19.7 21.3 162.0
调用获取了ping数据,因此您也可以尝试从命令行执行其余的工作。
system()
或者您可以使用X <- as.numeric(system(
"ping -c 3 google.de | grep time= | cut -d '=' -f 4 | cut -d ' ' -f 1",
intern = TRUE
))
X
# [1] 29.2 17.8 23.8
而不是两次awk
来电。
cut
另一个选项是as.numeric(system(
"ping -c 3 -n google.de | grep time= | awk -F '=| ' '{ print $10 }'",
intern = TRUE
))
# [1] 23.4 19.6 29.3
,但我会留下一个给你。