文字列を含むすべての行を検索し、要約してカウントします

文字列を含むすべての行を検索し、要約してカウントします

いくつかのサブフォルダーに文字列を含むファイルが多数ありますtype="abc_が、そのバリエーションがいくつあるかはよくわかりません。そのため、ファイル内にabc_未知の文字列がいくつ出現するかを知りたいのです。type="abc_

私は、次のような行を含むものを取得したいと考えています

"type="abc_0815 found 50 times
"type="abc_0816 found 32 times
...

and so on.

もし私がそうしたいなら:

grep -rni 'type="abc_' * | wc

私はすでに 14905 回の出現を知っていますtype="abc_

誰か私を助けてくれませんか?

答え1

これは、findファイル リストを取得するために を使用し、それを に渡してcat、出力を解析しますawk

find . -type f |
xargs -I xx cat "xx" | awk '/type="abc_/{
  for(i=1;i<=NF;i++){
    if($i~/type="abc_/){ d[$i]++ } } } 
  END{ for(i in d){ print i"\tfound",d[i],"times." } }'

type="abc_4  found 1 times.
type="abc_3  found 2 times.
type="abc_6  found 1 times.
type="abc_2  found 2 times.
type="abc_10 found 3 times.
type="abc_5  found 1 times.

cat *検索対象をより柔軟にするために、simple ではなく find を使用します。

xargs .. cat | ..短縮形はfind . -type f -exec cat {} + | awk ..

答え2

-cgrep にカウントさせるには、フラグを追加するだけです。

0の結果が多すぎる場合はawkで除外する

  grep -rnic 'type="abc_' * | awk -F: '$NF>0' 

答え3

これに似たものを試してみてください:

grep -rni 'type="abc_' * |sed -n "s/.*\(abc_[0-9]*\).*/\1/p"|uniq -c| sed  "s/\(.*\)\(abc.*\)/\2 found \1 times/"

関連情報