166

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

4

20 回答 20

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

如果您考虑评论空行:

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

虽然,这取决于语言。

于 2008-09-22T13:23:10.327 回答
55
#!/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

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

在上面的 "./blog" "./punbb" "./js/3rdparty" 和 "./pma" 是我列入黑名单的文件夹,因为我没有在其中编写代码。.php、.as、.sql、.css、.js 也是正在查看的文件的扩展名。任何具有不同扩展名的文件都将被忽略。

于 2008-09-22T13:28:48.550 回答
39

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

cloc 计算许多编程语言中源代码的空白行、注释行和物理行。它完全用 Perl 编写,不依赖于 Perl v5.6 及更高版本的标准分发(来自一些外部模块的代码嵌入在 cloc 中),因此非常可移植。

于 2008-09-22T13:25:43.910 回答
38

有很多方法可以做到这一点,使用常见的 shell 实用程序。

我的解决方案是:

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

这会在 <file> 中搜索与模式 (-e) '^\s*$' 匹配的不匹配 (-v) 行,它是行的开头,后跟 0 个或多个空格字符,然后在一行的末尾(即除空格外没有其他内容),并显示匹配行的计数(-c)而不是匹配行本身。

与涉及到管道的方法相比,此方法的一个优点wc是您可以指定多个文件并为每个文件获取单独的计数:

$ grep -cve '^\s*$' *.hh

config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39
于 2008-09-22T13:27:42.017 回答
19

此命令计算非空行的数量。
cat fileName | grep -v ^$ | wc -l
grep -v ^$ 正则表达式功能是忽略空行。

于 2014-06-04T09:51:04.147 回答
14

'wc' 计算行数、单词数、字符数,因此要计算所有行(包括空白行),请使用:

wc *.py

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

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

'-v' 告诉 grep 输出除匹配的行以外的所有行 '^' 是行首 '\s*' 是零个或多个空白字符 '$' 是行尾您希望计算的所有文件(当前目录中的所有 python 文件)管道输出到 wc。就行了。

我正在回答我自己的(真正的)问题。找不到涵盖此内容的 stackoverflow 条目。

于 2008-09-22T13:24:30.107 回答
9
cat file.txt | awk 'NF' | wc -l
于 2019-10-28T15:01:18.123 回答
6
cat 'filename' | grep '[^ ]' | wc -l

应该做得很好

于 2008-09-22T13:28:15.917 回答
5
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 源代码,其中注释行以 / 或 * 开头(我在多行注释的每一行都使用 *)。

于 2014-02-14T08:08:36.177 回答
4
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
于 2008-09-22T13:23:10.280 回答
2

这是一个计算项目中代码行数的 Bash 脚本。它递归地遍历源代码树,并排除使用“//”的空行和单行注释。

# $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

享受!——柯伦

于 2014-04-01T00:01:52.237 回答
2

最简洁的命令是

grep -vc ^$ fileName

-c选项,你甚至不需要wc -l

于 2020-10-01T00:59:15.487 回答
1

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

grep -c '.' <list of files>

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

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

会给你每个文件的行数。

于 2008-09-22T13:28:34.887 回答
1

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

#!/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 p q;
) | dc;

示例用法:

./countlines.sh .py .java .html
于 2011-08-14T01:07:44.693 回答
1

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

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

它只不过是以前解决方案的集合。

于 2011-12-02T06:56:06.897 回答
0
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt

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

于 2011-01-03T16:44:59.700 回答
0

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

grep -v ^$ filename wc -l | sed -e 's/ //g' 
于 2011-02-23T11:56:02.770 回答
0
rgrep . | wc -l

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

于 2016-12-08T12:43:51.623 回答
0

试试这个:

> grep -cve ^$ -cve '^//' *.java

它很容易记住,它还排除了空白行和注释行。

于 2022-01-14T02:28:15.737 回答
-3

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

只是

wc -l *.c 

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

于 2012-05-05T02:02:45.507 回答