ディレクトリ内の一致の数を数えたいです。
grep -rn 'hello' .
行番号を印刷し、現在のディレクトリを再帰的に移動しながらうまく機能します。
grep -rc 'hello' .
一方、カウントを返さずに現在のディレクトリ内のすべてのファイルを印刷するようです。
似たようなものがあります質問と回答grep -r <pattern> <directory>
これは、toの結果をパイピングしてこれを行う方法を示していますが、wc -l
上記のコマンドが機能しない理由とgrepオプションのみを使用してこれを行う方法があるかどうかを知りたいです。
答え1
これは予想されます。
grep -r -n
再帰を実行して、指定されたパターンにgrep
一致する行を表示し、ファイル名と行番号を前に付けます。すべてのファイルで一致するすべての行を提供します。
-n
各出力行の前には、行1から始まり、ファイルの相対行番号が続きます。処理されたファイルごとに行番号カウンタがリセットされます。
grep -r -c
再帰が実行され、考慮されたgrep
すべてのファイルのファイル名とそのファイルのパターン一致数が表示されます。ファイルごとに1行ずつ提供されます。
-c
選択した行数のみを標準出力に書き込みます。
特定のディレクトリ内のすべてのファイルのパターンに一致する数を(再帰的に)取得するには、次grep -r
のように結果を提供できます。wc -l
リンクした回答で提案したとおり:
$ grep -r 'pattern' . | wc -l
到着のみ使用grep
これを達成するには:
$ grep -r 'pattern' . | grep -c 'pattern'
wc
正規表現エンジンを使用して改行を計算するのは「作業に適したツール」ですが、正規表現エンジンを使用して作業を実行するのは確かに過剰です。
-o
フラグもありますgrep
。
-o
各一致を印刷しますが、行全体ではなく一致のみを印刷します。
これは、各行の個々の一致を個別に計算したい場合に便利です。
$ grep -r -o 'pattern' . | wc -l
たとえば、次の2つのgrep
呼び出し(bash
またはksh93
)を比較します。
$ grep 'l' <<<"Hello world!" | wc -l
1
$ grep -o 'l' <<<"Hello world!" | wc -l
3