作成したビデオエンコーディングスクリプトの一部として作成したログファイルのリストがあります。
それらすべてを検索し、エンコードから特定の統計を出力したいと思います-エンコードの速度、使用された設定など。
この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を使用してこれを機能させたいと思います。
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}' {} \;
これを行う:
egrep 'RF|average' *
出力は、上記の出力と一致しません。次のようになります。
filename1: ...
filename1: ...
filename2: ...
filename3: ...
一致したものの数に応じて、一部のファイル名は1回だけ表示されます。
これはgrepでのみ実行できると思います。
grep -srHE 'average|RF' path/
s
はエラーを抑制し、r
は再帰的、H
はファイル名を表示し、E
(およびパイプ)は一致しますany =両方のパターンの。
このワンライナーを試してみてください:
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"' {} \;
このコマンドを試してください:
grep -P "average|RF" *
grep
は、ディレクトリ(*
)内のすべてのファイルを検索し、 Perl互換正規表現 (PCRE)average|RF
を使用して一致するものをすべて表示します。 average
とRF
の両方に一致します。
出力形式は次のようになります。
filename.log:<RF line>
filename.log:<average line>