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

时间:2013-12-06 13:17:09

标签: linux file command-line grep wc

我想计算具有多个子目录的目录中每个文件中的所有$个字符。 我的目标是计算PHP项目中的所有变量。这些文件的后缀为.php

我试过

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

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

修改

我的示例文件

<?php
class MyClass extends Controller {

$a;$a;
$a;$a;
$a;
$a;

2 个答案:

答案 0 :(得分:4)

以递归方式计算您可以执行的目录中的一组文件中$个字符的数量:

fgrep -Rho '$' some_dir | wc -l

要在递归中仅包含扩展名.php的文件,您可以改为使用:

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

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

答案 1 :(得分:1)

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

因此,下一个将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命令实现许多其他组合。