web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルをgrepし、ファイル名と一致するものを印刷します

作成したビデオエンコーディングスクリプトの一部として作成したログファイルのリストがあります。

それらすべてを検索し、エンコードから特定の統計を出力したいと思います-エンコードの速度、使用された設定など。

この1つのライナーを介して、1つのファイルで平均フレームレートを検索できます。

cat ${filename} | grep average

出力:

 work: average encoding speed for job is 23.211176 fps

レートファクターを検索します。

cat ${filename} | grep RF

ディレクトリ内のすべてのファイルを検索して、ファイル名と一緒に1つ、またはできれば両方の情報を印刷したいと思います。 findまたはgrepを使用してこれをワンライナーで取得する方法はありますか、それともスクリプトを作成する必要がありますか?

私はこのような出力が欲しいです:

/home/javanix/filename.log
    <RF line>
    <average line>

FreeBSD9またはUbuntu12.04を使用してこれを機能させたいと思います。

3
javanix

awkを目的の出力形式で使用する:

awk '/average|RF/{ if(f!=FILENAME){f=FILENAME;print f} print"\t"$0}' *.log

再帰検索の場合、

find path -name '*.log' -type f -exec \
  awk '/average|RF/{if(f!=FILENAME){f=FILENAME;print f}print"\t"$0}' {} \;
2

これを行う:

egrep 'RF|average' *

出力は、上記の出力と一致しません。次のようになります。

filename1: ...
filename1: ...
filename2: ...
filename3: ...

一致したものの数に応じて、一部のファイル名は1回だけ表示されます。

4
Fran

これはgrepでのみ実行できると思います。

grep -srHE 'average|RF' path/

sはエラーを抑制し、rは再帰的、Hはファイル名を表示し、E(およびパイプ)は一致しますany =両方のパターンの。

3
Shadok

このワンライナーを試してみてください:

find -exec sh -c 'x=$(grep average "$0";grep RF "$0") && echo "$0\n$x"' {} \;

それは生成します:

<file 1>
<RF line>
<average line>
[...]

コードを短くするためのインデントがないことがわかるように、別の方法として、ファイル行に次のようなマークを付けることができます。

[...] echo ">>> $0\n$x"' {} \;
0
cYrus

このコマンドを試してください:

grep -P "average|RF" *

grepは、ディレクトリ(*)内のすべてのファイルを検索し、 Perl互換正規表現 (PCRE)average|RFを使用して一致するものをすべて表示します。 averageRFの両方に一致します。

出力形式は次のようになります。

filename.log:<RF line>
filename.log:<average line>
0
Dennis