文字列を含むすべての行を検索する - 合計と計算

文字列を含むすべての行を検索する - 合計と計算

文字列を含む複数のサブフォルダには多くのファイルがあります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 *コンテンツ検索にはより柔軟性があります。

xargs .. cat | ..に短縮することができるfind . -type f -exec cat {} + | awk ..

答え2

-cフラグを追加し、grepにそれを計算させます。

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/"

関連情報