计算文件中字符的出现次数

我想统计一个目录中的每个文件中的所有$字符与几个子目录。 我的目标是计算一个PHP项目中的所有variables。 这些文件有后缀.php

我试过了

 grep -r '$' . | wc -c grep -r '$' . | wc -l 

和很多其他的东西,但都返回了一个不匹配的数字。 在我的示例文件中只有四个$ 。 所以我希望有人能帮助我。

编辑

我的示例文件

 <?php class MyClass extends Controller { $a;$a; $a;$a; $a; $a; 

要递归计算目录中一组文件中$字符的数量,您可以:

 fgrep -Rho '$' some_dir | wc -l 

要在递归中只包含扩展名为.php ,你可以使用:

 fgrep -Rho --include='*.php' '$' some_dir | wc -l 

-R用于递归遍历some_dir的文件, -o用于匹配每行搜索的部分。 这组文件被限制为模式*.php并且文件名不包含在带有-h的输出中,否则可能会导致误报。

为了计算PHP项目中的变量,你可以使用这里定义的variable regex

所以,下一个会grep每个文件的所有变量:

 cd ~/my/php/project grep -Pro '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' . -P - use perlish regex -r - recursive -o - each match on separate line 

会产生像这样的东西:

 ./elFinderVolumeLocalFileSystem.class.php:$path ./elFinderVolumeLocalFileSystem.class.php:$path ./elFinderVolumeMySQL.class.php:$driverId ./elFinderVolumeMySQL.class.php:$db ./elFinderVolumeMySQL.class.php:$tbf 

你要数他们,所以你可以使用:

 $ grep -Proc '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' . 

并会得到count of variables in each file ,如:

 ./connector.minimal.php:9 ./connector.php:9 ./elFinder.class.php:437 ./elFinderConnector.class.php:46 ./elFinderVolumeDriver.class.php:1343 ./elFinderVolumeFTP.class.php:577 ./elFinderVolumeFTPIIS.class.php:63 ./elFinderVolumeLocalFileSystem.class.php:279 ./elFinderVolumeMySQL.class.php:335 ./mime.types:0 ./MySQLStorage.sql:0 

当需要by file and by variable计数时,可以使用:

 $ grep -Pro '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' . | sort | uniq -c 

为了得到如下结果:

  17 ./elFinderVolumeLocalFileSystem.class.php:$target 8 ./elFinderVolumeLocalFileSystem.class.php:$targetDir 3 ./elFinderVolumeLocalFileSystem.class.php:$test 97 ./elFinderVolumeLocalFileSystem.class.php:$this 1 ./elFinderVolumeLocalFileSystem.class.php:$write 6 ./elFinderVolumeMySQL.class.php:$arc 3 ./elFinderVolumeMySQL.class.php:$bg 10 ./elFinderVolumeMySQL.class.php:$content 1 ./elFinderVolumeMySQL.class.php:$crop 

在这里你可以看到,变量$write只被使用一次,所以(也许)它是无用的。

您也可以对per variable per whole project计数

 $ grep -Proh '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' . | sort | uniq -c 

并会得到像这样的东西:

  13 $tree 1 $treeDeep 3 $trg 3 $trgfp 10 $ts 6 $tstat 35 $type 

在那里你可以看到,比$treeDeep在整个项目中只使用一次,所以它肯定是没用的。

您可以使用不同的grepsortuniq命令来实现许多其他组合。