正規表現から単一のグループのみを抽出する

正規表現から単一のグループのみを抽出する

一緒にハッキングされたいくつかのログファイルから数値リストを取得するためにzgrepを使用しようとしています。だから私は以下を使用しています:

zgrep -ie "total time: .* ms" *

これは私が興味のある行全体を返します。私は番号をしたいだけです。 (合計時間以降、「ms」以前)追加の処理なしでこの情報を取得する方法はありますか?

答え1

grepあなたがGNUgrepであり、探している数字が行の唯一の数字であると仮定している場合:

zgrep -ioEe '[0-9]+(\.[0-9]+)?' *

そうでない場合は、いつでもzgrep出力をフィルタリングできます。

zgrep -ie 'total time: .* ms' * | sed 's/.*total time: \(.*\) ms.*/\1/'

答え2

GNU grepを使用すると、2つの機能を組み合わせて目的のものを得ることができます。

  • -o行の一致部分のみを印刷するオプション。
  • Perl正規表現とその幅0のツアーアサーションゲームの前後に表示される内容を制限します。
zgrep -Pi -o '(?<=total time: )([0-9.]+)(?= *ms)' *

あるいは、Perlを呼び出すこともできます。

perl -MPerlIO::gzip -e 'for (@ARGV) {
    open IN, (/\.gz$/ ? "<:gzip" : "<"), $_ or die "$_: $!";
    $name = $_;
    while (<IN>) {
        if (/total time: ([0-9.]+) *ms/i) {print "$name:$1\n"}
    }
    close IN
}' *

これらのツールがない場合は、手動でファイルを繰り返し呼び出して、sed関心のあるものを除くすべてのものを削除できます。

for x in *; do
  case "$x" in
    *.gz) <"$x" gunzip;;
    *) cat "$x";;
  esac | sed -n -e 's/^.*total time: \([0-9.]*\) *ms.*$/\1/p'
done

関連情報