awk/sed/grepを使用してコンテンツごとに多くのファイルを効率的にフィルタリング

awk/sed/grepを使用してコンテンツごとに多くのファイルを効率的にフィルタリング

2行目が特定の正規表現に正確に一致するディレクトリ内のすべてのファイルを(再帰的に)リストしたいと思います。総ファイル数は約60Kです。

find /path -type f | xargs --no-run-if-empty -n1000 awk 'FNR = 2 && $0 ~ /^regular expression$/ {print FILENAME; nextfile}'これまで、私は次のコマンドを書きました。

効率を向上させることはできますか?

ベストアンサー1

=まず、正しく使用するのではなく、誤って使用していることに注意してください==

その必要はありませんxargs。ただ実行するだけですfind。また、awkファイル全体を読み取るのではなく、行2を処理した直後に終了する必要があります。

find /path -type f -exec awk 'FNR == 2 && /^regular expression$/ {print FILENAME}; FNR == 2 {nextfile}' '{}' +

引数+の末尾にある-execディレクティブは、findできるだけ多くのファイル名引数を配置します。ララxargs。バラよりfind文書。

ここで重要な点はですFNR==2 {nextfile}

(しかし、可能であれば&を使用する-execよりも)より良いかどうかは議論の余地があります。一方では、以前のバッチの検証中により多くのファイル名を読み取ることができるようにすることで、ある程度の並列処理が達成されます。一方、並列化により、不良ディスクがディスク上の他のトラックと競合する可能性があります。ハードウェア(キャッシュサイズ、SSDなど)によってこの内容が変わります。その後、プロファイルが決定します。xargs-print0-0find … | xargs …findawkawkfind

おすすめ記事