web-dev-qa-db-ja.com

findコマンドを使用してテキストとファイルの総数を見つける方法

findコマンドを実行して、特定のテキスト文字列の出現回数の合計と、このテキスト文字列が含まれるファイルの数を確認しようとしています。

私が今持っているのはこのコマンドです。

find . -name "*.txt" | xargs grep -i "abc"

これは、テキスト「abc」を含むすべての「* .txt」ファイルを報告します。 1つまたは2つのfindコマンドで取得したい

  1. Abcが出現した合計回数
  2. Abcが含まれているファイルの総数。
6
Nomad

質問1の場合、これを行うことができます。

find . -name "*.txt" | xargs grep -i "abc" | wc -l

これは、すべてのテキストファイルでのabcの一致の総数をカウントします。

そして質問2について、私は次のことを思いつきました。

find . -name "*.txt" -exec grep -i "abc" {} + | cut -d: -f1 | sort | uniq | wc -l

これは、一致のリストから一意のファイル名を取得し、それらをカウントします(ソートはおそらく必要ありません)。


Miracle173で指摘されているように、grepには「ファイルごとに1つの一致」フラグが付属しているため、コマンドを次のように短縮できます。

find . -name "*.txt" -exec grep -il "abc" {} + | wc -l

6
SigueSigueBen

ファイルに含まれるABCの数:

.txtファイル内のすべての「abc」の数を数えるには、grep -cを使用して、次を検索し、例外的に-cat:

find . -name "*.txt" -exec cat {} + | grep -ic abc

Grep -cはあなたのために合計カウントを行います-私がSigueSigueBenの答えで見つけられなかったもので、xargsへの不当な呼び出し、imhoが含まれています。他の2つは、私にとってどこに憧れるかを答えます。私はそれらを勉強しなかったし、そのようなことを自分で書こうとはしなかった。

Abcを含むファイルの数:

find . -name "*.txt" -exec grep -iq abc {} ";" -printf "1" | wc -c 

これは、ファイル名(めったにありませんが、認めます)に改行が含まれていても失敗しません(完全に合法です)。

1
user unknown