「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

誰でも助けることができますか?awkorを使用する必要があるようです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されます。この場合、2番目の変数では、space+かっこの前のすべての項目(+括弧を除く)と開き、括弧の後の$1すべての項目(スペースを除く)と一致します。\S+$2

関連情報