在bash中计数(非空白)行代码

在Bash中,如何计算项目中非空行代码的数量?

 cat foo.c | sed '/^\s*$/d' | wc -l 

如果您考虑评论空白行:

 cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l 

虽然,这是语言的依赖。

 #!/bin/bash find . -path './pma' -prune -o -path './blog' -prune -o -path './punbb' -prune -o -path './js/3rdparty' -prune -o -print | egrep '\.php|\.as|\.sql|\.css|\.js' | grep -v '\.svn' | xargs cat | sed '/^\s*$/d' | wc -l 

上面的代码将为您提供项目(当前文件夹和所有子文件夹recursion)的代码行总数(删除空行)。

在上面的“./blog”“./punbb”“./js/3rdparty”和“./pma”是我黑名单的文件夹,因为我没有写在他们的代码。 另外.php,.as,.sql,.css,.js是正在查看的文件的扩展名。 任何具有不同扩展名的文件都将被忽略。

如果你想使用shell脚本以外的东西,请尝试CLOC :

cloc计算许多编程语言中的空白行,注释行和源代码的物理行。 它完全用Perl编写,除了Perl v5.6和更高版本的标准发行版之外没有任何依赖关系(一些外部模块的代码embedded在cloc中),因此非常便于携带。

有很多方法可以做到这一点,使用常用的shell工具。

我的解决scheme是:

 grep -cve '^\s*$' <file> 

这会在<file>中search不匹配符合(-e)行(-e)的行(-v)“^ \ s * $”,这是行的开头,后跟0个或多个空白字符在一行的结尾(即没有内容,然后是空格),并显示匹配行数(-c)而不是匹配行本身。

这个方法相对于涉及到pipe道的方法的一个优点是可以指定多个文件并为每个文件分别计数:

 $ grep -cve '^\s*$' *.hh config.hh:36 exceptions.hh:48 layer.hh:52 main.hh:39 

'wc'计算行数,字数,字符数,所以统计所有行(包括空行)用法:

 wc *.py 

要过滤掉空行,你可以使用grep:

 grep -v '^\s*$' *.py | wc 

'-v'告诉grep输出除匹配'^'之外的所有行'\ s *'是零个或多个空白字符'$'是一行的结尾* .py是我的示例你想要统计的所有文件(当前目录中的所有python文件)pipe道输出到wc。 就行了。

我正在回答我自己的(真正的)问题。 无法find覆盖此的一个计算器条目。

这个命令统计我们项目中非空行的数量。
cat fileName | grep -v ^$ | wc -l
grep -v ^ $正则expression式的function是忽略空行。

 cat 'filename' | grep '[^ ]' | wc -l 

应该做的伎俩就好了

 awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile" 
 grep -cvE '(^\s*[/*])|(^\s*$)' foo -c = count -v = exclude -E = extended regex '(comment lines) OR (empty lines)' where ^ = beginning of the line \s = whitespace * = any number of previous characters or none [/*] = either / or * | = OR $ = end of the line 

我张贴这个因为其他选项给了我错误的答案。 这与我的Java源代码,其中注释行以/或*开头(我在多行注释的每一行使用*)。

这是一个Bash脚本,用于统计项目中的代码行。 它recursion地遍历一个源代码树,它排除了使用“//”的空行和单行注释。

 # $excluded is a regex for paths to exclude from line counting excluded="spec\|node_modules\|README\|lib\|docs\|csv\|XLS\|json\|png" countLines(){ # $total is the total lines of code counted total=0 # -mindepth exclues the current directory (".") for file in `find . -mindepth 1 -name "*.*" |grep -v "$excluded"`; do # First sed: only count lines of code that are not commented with // # Second sed: don't count blank lines # $numLines is the lines of code numLines=`cat $file | sed '/\/\//d' | sed '/^\s*$/d' | wc -l` # To exclude only blank lines and count comment lines, uncomment this: #numLines=`cat $file | sed '/^\s*$/d' | wc -l` total=$(($total + $numLines)) echo " " $numLines $file done echo " " $total in total } echo Source code files: countLines echo Unit tests: cd spec countLines 

以下是我的项目的输出结果:

 Source code files: 2 ./buildDocs.sh 24 ./countLines.sh 15 ./css/dashboard.css 53 ./data/un_population/provenance/preprocess.js 19 ./index.html 5 ./server/server.js 2 ./server/startServer.sh 24 ./SpecRunner.html 34 ./src/computeLayout.js 60 ./src/configDiff.js 18 ./src/dashboardMirror.js 37 ./src/dashboardScaffold.js 14 ./src/data.js 68 ./src/dummyVis.js 27 ./src/layout.js 28 ./src/links.js 5 ./src/main.js 52 ./src/processActions.js 86 ./src/timeline.js 73 ./src/udc.js 18 ./src/wire.js 664 in total Unit tests: 230 ./ComputeLayoutSpec.js 134 ./ConfigDiffSpec.js 134 ./ProcessActionsSpec.js 84 ./UDCSpec.js 149 ./WireSpec.js 731 in total 

请享用! – Curran

这给出了不计算空行的行数:

 grep -v ^$ filename wc -l | sed -e 's/ //g' 

这有点取决于你在项目中的文件数量。 理论上你可以使用

 grep -c '.' <list of files> 

您可以使用find实用程序填写文件列表。

 grep -c '.' `find -type f` 

会给你一个文件的行数。

以recursion方式计算当前目录中具有特定文件扩展名的所有非空行的脚本:

 #!/usr/bin/env bash ( echo 0; for ext in "$@"; do for i in $(find . -name "*$ext"); do sed '/^\s*$/d' $i | wc -l ## skip blank lines #cat $i | wc -l; ## count all lines echo +; done done echo pq; ) | dc; 

示例用法:

 ./countlines.sh .py .java .html 

如果您希望整个项目中给定文件扩展名的所有文件的所有非空行的总和:

 while read line do grep -cve '^\s*$' "$line" done < <(find $1 -name "*.$2" -print) | awk '{s+=$1} END {print s}' 

第一个arg是项目的基本目录,第二个是文件扩展名。 示例用法:

 ./scriptname ~/Dropbox/project/src java 

这只是以前解决scheme的集合。

 grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt 

给出当前目录及其子目录中所有文件的总计数。

HTH!

 rgrep . | wc -l 

给出当前工作目录中非空行的数量。

在linux上已经有一个名为“wc”的程序。

只是

 wc -l *.c 

它为您提供了每个文件的总行数和行数。