web-dev-qa-db-ja.com

sedまたはその他のツールを使用してファイル内の数値を抽出するにはどうすればよいですか?

この形式のファイルがあります

[2014/05/01 10:48:26 | 13963 |デバッグ]プロセスを完了するのに11.16837501525879秒かかりました

だから私はこのような何千もの行を持っています、そして私は11.16837501525879部分を「抽出」したいと思います
私は試した:

 sed -e 's/^.* (\d+\.\d*)/\1/g' logfile.txt > out.txt  

しかし私は得る:

sed: -e expression #1, char 21: invalid reference \1 on `s' command's RHS  

ここで何ができますか?

5
Jim

sedはデフォルトで基本正規表現を使用し、BREは\dを認識しません。ここにいくつかの他のアプローチがあります:

  1. sed

    sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
    

    -rは、括弧をエスケープする必要がないようにするために必要です。

  2. Perl

    Perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
    
  3. grep

    grep -Po '.* \K\d+\.*\d*' logfile.txt > outfile.txt
    

これらはすべて、基本的なアプローチを使用します。これは、行の先頭にスペースが付いているfind all数字のセットを埋めます。行に表示できる数値のセットの数に応じて、入力行が常に表示する形式である場合、より安全な方法は次のとおりです。

grep -Po 'took \K\d+\.*\d*' logfile.txt 
8
terdon

グループ化の括弧は、sedではバックスラッシュで囲む必要があります。また、sedは\dをサポートしていません。さらに、単語afterを削除する必要もあります。

sed -e 's/^.* \([0-9]\+\.[0-9]*\) .*/\1/g'

ところで、ドットは常に存在しますが、10進数はオプションですか? 12.は期待値とは思えません。

4
choroba

Awkを使用して11番目の列を印刷できます。

awk '{ print $11 }' logfile.txt > output
0
Klik