一致するキーワードを含むディレクトリのファイル数を取得しようとしています。私が使用するコードは次のとおりです。
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
最初のディレクトリの前に追加してください。-exec
find
これは、現在のディレクトリまたは次のディレクトリにあるファイル名サフィックスを持つすべてのファイルで実行されますgrep -q -e 'pattern'
。.sas
一致するファイルごとにpattern
出力x
が発生しますecho x
。echo
その後、この方法で出力される行数を計算するために使用されますwc -l
。ファイル名に改行文字を含めることができるので、x
filenameの代わりに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
また、次から見たりスクロールしたりするのではなく、知りたい各スイッチをすばやく確認して使用するのに役立ちます。