bash中的count(非空白)代码行

时间:2008-09-22 13:20:42

标签: bash unix count lines nonblank

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

19 个答案:

答案 0 :(得分:173)

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

如果您考虑注释空白行:

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

虽然,这取决于语言。

答案 1 :(得分:50)

#!/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是正在查看的文件的扩展名。任何具有不同扩展名的文件都将被忽略。

答案 2 :(得分:32)

如果您想使用shell脚本以外的其他内容,请尝试CLOC

  

cloc计算空白行,评论   线和物理线   许多编程语言中的代码。它   完全用Perl编写,没有   标准之外的依赖关系   Perl v5.6及更高版本的分布   (来自某些外部模块的代码是   嵌入在cloc中)等等   便携式的。

答案 3 :(得分:26)

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

我的解决方案是:

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

这会搜索&lt; file&gt;中的行。不匹配(-v)匹配模式(-e)'^ \ s * $'的行,它是一行的开头,后跟0或更多的空白字符,后跟一行的结尾(即。除了空白之外没有其他内容),并显示匹配行数(-c)而不是匹配行本身。

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

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

config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39

答案 4 :(得分:13)

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

wc *.py

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

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

' - v'告诉grep输出除匹配之外的所有行 '^'是一行的开头 '\ s *'是零个或多个空格字符 '$'是一条线的终点 * .py是我想要计算的所有文件的示例(当前目录中的所有python文件) 管道输出到wc。你离开了。

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

答案 5 :(得分:7)

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

答案 6 :(得分:4)

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

应该做的很好

答案 7 :(得分:4)

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源代码,其中注释行以/或*开头(我在多行注释中的每一行都使用*)。

答案 8 :(得分:3)

awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"

答案 9 :(得分:2)

最近的命令是

<script>    
sel = document.getElementById("menu-selection");
    canvasChoice = document.getElementById("menu-canvas");
    
    
    sel.addEventListener('change', function(){
       idx = sel.selectedIndex;
       // Log for debugging
    //   console.log(idx);
    
       switch(idx){
       case 0: canvasChoice.innerHTML = '[elementor-template id="218"]'; break;
       case 1: canvasChoice.innerHTML = '[elementor-template id="226"]'; break;
       case 2: canvasChoice.innerHTML = '[elementor-template id="229"]'; break;
       case 3: canvasChoice.innerHTML = '[elementor-template id="232"]'; break;
       case 4: canvasChoice.innerHTML = '[elementor-template id="319"]'; break;
       case 5: canvasChoice.innerHTML = '[elementor-template id="349"]'; break;
       case 6: canvasChoice.innerHTML = '[elementor-template id="235"]'; break;
       case 7: canvasChoice.innerHTML = '[elementor-template id="311"]'; break;
       case 8: canvasChoice.innerHTML = '[elementor-template id="314"]'; break;
       case 9: canvasChoice.innerHTML = '[elementor-template id="323"]'; break;
       case 10: canvasChoice.innerHTML = '[elementor-template id="238"]'; break;
       case 11: canvasChoice.innerHTML = '[elementor-template id="242"]'; break;
       case 12: canvasChoice.innerHTML = '[elementor-template id="850"]'; break;
       case 13: canvasChoice.innerHTML = '[elementor-template id="926"]'; break;
       default: break;
    }
    });
</script>

使用grep -vc ^$ fileName 选项,您甚至不需要-c

答案 10 :(得分:2)

这是一个Bash脚本,用于计算项目中的代码行数。它以递归方式遍历源树,并且不包括使用&#34; //&#34;的空白行和单行注释。

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

以下是my project的输出结果:

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

答案 11 :(得分: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

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

答案 12 :(得分: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

答案 13 :(得分:1)

rgrep . | wc -l

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

答案 14 :(得分:1)

cat file.txt | awk 'NF' | wc -l

答案 15 :(得分:1)

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

grep -c '.' <list of files>

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

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

会为每个文件提供行数。

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

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

HTH!

答案 18 :(得分:-3)

在Linux上已经有一个名为&#39; wc&#39;的程序。

只需

wc -l *.c 

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