我有这个小脚本来测试 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
有谁可以帮忙吗?我怀疑我应该使用awk
或sed
?
答案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