我有一个日志文件,其中包含来自某个网站的 ping,该文本文件称为pingoutput.txt
按行分隔每个 ping 回复。现在,我需要从这个文本文件中提取其间的往返时间,time=
并将其ms
提取到另一个文本文件或列表中,然后我可以将其从最小到最大排序。
64 bytes from onofri.org (67.222.36.105): icmp_req=1 ttl=47 time=202 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=2 ttl=47 time=206 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=3 ttl=47 time=215 ms
该pingoutput.txt
文件也很大,大约有 86400 行。我在 Linux 上通过 shell 脚本执行此操作。
答案1
这对我有用:
sed 's/.*time=\([0-9]*\) .*/\1/' times | sort -n > outfile
times
这个文件在哪里:
cat times
64 bytes from onofri.org (67.222.36.105): icmp_req=1 ttl=47 time=202 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=2 ttl=47 time=206 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=3 ttl=47 time=215 ms
看起来outfile
像这样:
cat outfile
202
206
215
答案2
您还可以使用 Perl regex 和 grep
grep -oP '(?<=time\=).*' pingoutput
答案3
您可以使用以下示例脚本提取时间:
awk -F\= '{print int($4)}' pingoutput.txt
它使用 = 作为分隔符并使用 int 函数仅获取“202 ms”字符串的数量
要将输出重定向到其他文件,请使用命令:
awk -F\= '{print int($4)}' pingoutput.txt > times.txt
为了对输出进行排序,您可以通过管道将 awk 的输出传递给 sort 命令
awk -F\= '{print int($4)}' pingoutput.txt |sort -n > times.txt
答案4
如果您可以pcre
选择grep
$ grep -oP 'time=\K\d+' pingout.txt
202
206
215
$ grep -oP 'time=\K\d+' pingout.txt | sort -n
202
206
215
$ grep -oP 'time=\K\d+' pingout.txt | sort -nr
215
206
202
time=\K
积极的后视字符串time=
- 这不是输出的一部分\d+
一位或多位数字,也可用于[^ ]+
提取空格以外的字符
要将输出保存到文件,请使用>
重定向
$ grep -oP 'time=\K\d+' pingout.txt | sort -n > op.txt
$ cat op.txt
202
206
215