この形式のファイルがあります
[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
ここで何ができますか?
sed
はデフォルトで基本正規表現を使用し、BREは\d
を認識しません。ここにいくつかの他のアプローチがあります:
sed
sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
-r
は、括弧をエスケープする必要がないようにするために必要です。
Perl
Perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
grep
grep -Po '.* \K\d+\.*\d*' logfile.txt > outfile.txt
これらはすべて、基本的なアプローチを使用します。これは、行の先頭にスペースが付いているfind all数字のセットを埋めます。行に表示できる数値のセットの数に応じて、入力行が常に表示する形式である場合、より安全な方法は次のとおりです。
grep -Po 'took \K\d+\.*\d*' logfile.txt
グループ化の括弧は、sedではバックスラッシュで囲む必要があります。また、sedは\d
をサポートしていません。さらに、単語afterを削除する必要もあります。
sed -e 's/^.* \([0-9]\+\.[0-9]*\) .*/\1/g'
ところで、ドットは常に存在しますが、10進数はオプションですか? 12.
は期待値とは思えません。
Awkを使用して11番目の列を印刷できます。
awk '{ print $11 }' logfile.txt > output