find
特定のテキスト文字列の総発生回数とそのテキスト文字列を含むファイル数を見つけるためのコマンドを実行しようとしています。
今私が持っているのはこのコマンドです。
find . -name "*.txt" | xargs grep -i "abc"
「abc」というテキストを含むすべての「* .txt」ファイルを報告します。 1つまたは2つの検索コマンドをインポートしたいと思います。
- abcの総発生回数
- abc を含むファイルの総数。
答え1
質問1の場合は、次のようにできます。
find . -name "*.txt" | xargs grep -i "abc" | wc -l
合計一致回数を計算します。アルファベットすべてのテキストファイルで。
質問2の場合、次のように考えました。
find . -name "*.txt" -exec grep -i "abc" {} + | cut -d: -f1 | sort | uniq | wc -l
これは一致リストから一意のファイル名を取得して数を数えます(ソートは不要です)。
Miracle173が指摘したように、grep
「ファイルごとに一度一致」フラグを使用すると、コマンドを次のように短縮できます。
find . -name "*.txt" -exec grep -il "abc" {} + | wc -l
答え2
grepの-c
オプションが必要です
find . -name \*txt | xargs grep -c -i "abc" | {
total=0
count=0
while IFS=: read name num; do
((num > 0)) && ((count+=1))
((total+=num))
done
echo total=$total
echo count=$count
}
while
サブシェルの範囲内で変数を保持するために、ループの周りでコマンドをグループ化するには中括弧が必要です。
答え3
$ grep -R --include='*.txt' -c -i abc . | awk -F: '
BEGIN {
totalCount=0;noOfFiles=0;
}
{ totalCount=totalCount+$2;
if ( $2 > 0 )
{
noOfFiles+=1;
}
}
END {
print "Total number of times abc appears:"totalCount;
print "Total number of files which has abc in it:"noOfFiles
} '
(または)
ls 出力は、他のプログラムで解析してはいけません。以下のコメントをご覧ください。
$ ls -Rltr | awk '/.txt/{print $NF }' | xargs grep -c -i "abc" | awk -F: '
BEGIN {
totalCount=0;noOfFiles=0;
}
{ totalCount=totalCount+$2;
if ( $2 > 0 )
{
noOfFiles+=1;
}
}
END {
print "Total number of times abc appears:"totalCount;
print "Total number of files which has abc in it:"noOfFiles
} '
Result:
Total number of times abc appears:0
Total number of files which has abc in it:0
答え4
ファイルに含まれるabcの数:
.txtファイル内のすべての「abc」の数を数えるには、grep -cを使用してcatを見つけて除外します。
find . -name "*.txt" -exec cat {} + | grep -ic abc
Grep -c は合計を計算します。 IMHOへの不合理な呼び出しを含むSigueSigueBenの回答でこの回答が見つかりませんでしたxargs
。他の二人は私が欲しいところに答えた。私はそれらを研究したことがないし、自分自身もそのような文章を書かないでしょう。
abcを含むファイルの数:
find . -name "*.txt" -exec grep -iq abc {} ";" -printf "1" | wc -c
名前に改行文字を含むファイル名(私が認める場合はまれです)(完全に正当です)では、この操作は失敗しません。