从“wget”输出中选择一部分文本并记录到文件中?

从“wget”输出中选择一部分文本并记录到文件中?

我有这个小脚本来测试 FTP 站点:

#!/bin/bash

wget -O /dev/null ftp://someftpsite:[email protected]/testdump300 2>&1 | \
   grep '\([0-9.]\+ [M]B/s\)' >> wget300.log

它显示的输出如下:

2018-07-26 22:30:06 (22.7 MB/s) - '/dev/null' saved [104857600]

好吧,现在我只想像这样:

2018-07-26 22:30:06 22.7

有谁可以帮忙吗?我怀疑我应该使用awksed

答案1

使用awk

$ wget -O /dev/null ftp://someftpsite:[email protected]/testdump300 2>&1 | \
   awk '/[0-9]+ [M]B\/s/{ sub("\\(",""); print $1,$2,$3 }' >> wget300.log

这将消除您对搜索正则表达式模式grep的需要。awk它将删除(速度之前的 ,然后打印第 1、2 和 3 列(日期、时间和速度)。

答案2

这是使用的替代方法sed

$ wget -O /dev/null ftp://someftpsite:[email protected]/testdump300 2>&1 | \
   sed 's/(//;s/ [[:alpha:]]\+\/s.*$//' >> wget300.log

怎么运行的:

  • s/(//;- 删除第一个括号
  • s/ [[:alpha:]]\+\/s.*$//- 删除从space+ 'MB/s' 开始到结尾的所有内容.*$

另一种使用方法perl

$ wget -O /dev/null ftp://someftpsite:[email protected]/testdump300 2>&1 | \
   perl -lne 'print "$1 $2" if /^(.*)\s\((\S+)/' >> wget300.og

怎么运行的:

  • Perl 中括号中的任何内容都会被保存,因此会保存$1$2变量。在这种情况下,我们将匹配第二个变量 中的space+ 括号之前的所有内容(但不包括+ 括号)$1以及开括号之后的所有内容(不是空格)。\S+$2

相关内容