grep を使用してキーワードが存在するファイルの数を取得します。 [閉じる]

grep を使用してキーワードが存在するファイルの数を取得します。 [閉じる]

一致するキーワードを含むディレクトリのファイル数を取得しようとしています。私が使用するコードは次のとおりです。

grep -r -i --include=*.sas 'keyword'- キーワードの総数を教えてくれます。

grep -l "keyword" --include="*.sas" * | wc -l- このコードは機能しません。

誰もがキーワードを含むファイルの数を取得するのに役立ちますか?

答え1

find個人的に私は計算のためにandを一緒に使いますgrep

find . -type f -name '*.sas' -exec grep -q -e 'pattern' {} \; -exec echo x \; |
wc -l

サブディレクトリに再帰的に移動したくない場合は、-maxdepth 1最初のディレクトリの前に追加してください。-execfind

これは、現在のディレクトリまたは次のディレクトリにあるファイル名サフィックスを持つすべてのファイルで実行されますgrep -q -e 'pattern'.sas一致するファイルごとにpattern出力xが発生しますecho xechoその後、この方法で出力される行数を計算するために使用されますwc -l。ファイル名に改行文字を含めることができるので、xfilenameの代わりにesを評価します。wc

非再帰バリアントの場合は、単純なシェルループを選択することもできます。

for name in ./*.sas; do
    [ ! -f "$name" ] && continue
    grep -q -e 'pattern' "$name" && echo x
done | wc -l

または、

n=0
for name in ./*.sas; do
    [ ! -f "$name" ] && continue
    grep -q -e 'pattern' "$name" && n=$((n + 1))
done
echo "$n"

pattern正規表現ではなく文字列の場合は、代わりにそれを使用してくださいgrep -q -F -e 'string'

答え2

find $DIR  -type f  -name '*.sas'  -exec grep -m1 -e 'pattern' {} \; | wc -l

-m1オプションを使用すると、grepファイルごとに最大1行を出力し、wc -lパターンを含む正しいファイル数を提供します。

答え3

grep -rl --include='*.sas' keyword . | wc -l

ファイルパスに改行文字が含まれていない場合は機能します。

これを使用するには、行ではなくNULで区切られたレコードに切り替える必要があります。

grep -rlZ --include='*.sas' keyword . | tr -cd '\0' | wc -c

(/は非標準拡張子であり、-rロケール(UTF-8ロケールなど)で有効な文字を形成しないバイトシーケンスを含むファイル名と一致させることはできません。-Z--include*.sas$'st\xe9phane.sas'

答え4

\grep -rh -i -m1 --include='*.sas' -e 'pattern' |wc -l

-h:ファイル名を出力しません。改行文字を含むファイル/パスでは中断されません。
-m1:最初の一致が見つかったら、ファイルの残りの部分の読み取りを停止します
-r。 :再帰
-i:大文字と小文字を区別しない一致
-e:PATTERNを次のように使用します。模様;-パターンの先頭に表示される場合は、grepスイッチ識別子として扱わないでください。


man grepまた、次から見たりスクロールしたりするのではなく、知りたい各スイッチをすばやく確認して使用するのに役立ちます。

関連情報