代码之家  ›  专栏  ›  技术社区  ›  Jonathan Hartley Zombie

计数bash中的代码行(非空)

  •  128
  • Jonathan Hartley Zombie  · 技术社区  · 16 年前

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

    17 回复  |  直到 16 年前
        1
  •  207
  •   Michael Cramer    16 年前
    cat foo.c | sed '/^\s*$/d' | wc -l
    

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

    不过,这取决于语言。

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

        3
  •  39
  •   xsl Fredrik Hedblad    16 年前

    如果要使用shell脚本以外的其他脚本,请尝试 CLOC

    cloc统计空行、注释 线和源的物理线 许多编程语言中的代码。信息技术 完全用Perl编写,没有 标准之外的依赖关系 PerlV5.6及更高版本的发布 (来自某些外部模块的代码为 嵌入到cloc中),因此

        4
  •  38
  •   SpoonMeiser    16 年前

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

    我的解决办法是:

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

    这将在<文件>不匹配(-v)与模式(-e)“^\s*$”匹配的行,模式(-e)^\s*$”是行的开头,后跟0个或多个空格字符,后跟行的结尾(即除空格外没有其他内容),并显示匹配行的计数(-c),而不是匹配行本身。

    wc ,即您可以指定多个文件,并为每个文件获取单独的计数:

    $ grep -cve '^\s*$' *.hh
    
    config.hh:36
    exceptions.hh:48
    layer.hh:52
    main.hh:39
    
        5
  •  17
  •   coastline    5 年前


    cat fileName | grep -v ^$ | wc -l
    grep-v^$regular expression函数为忽略空行。

        6
  •  14
  •   Jonathan Hartley    12 年前

    wc *.py
    

    若要过滤空白行,可以使用GRIP:

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

    “^”是一行的开头 “\s*”是零个或多个空白字符 *.py是我希望计数的所有文件的示例(当前目录中的所有python文件)

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

        7
  •  8
  •   Das_Geek Narendra Chennamsetti    5 年前
    cat file.txt | awk 'NF' | wc -l
    
        8
  •  6
  •   curtisk    16 年前
    cat 'filename' | grep '[^ ]' | wc -l
    

        9
  •  4
  •   Ben Hoffstein    16 年前
    awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
    
        10
  •  4
  •   sami    10 年前
    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源代码中起作用,其中注释行以/或*开头(我在多行注释中的每一行上都使用*)。

        11
  •  2
  •   curran    10 年前

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

        12
  •  2
  •   Son Nguyen    4 年前

    最整洁的命令是

    grep -vc ^$ fileName
    

    具有 -c wc -l

        13
  •  1
  •   Linor    16 年前

    grep -c '.' <list of files>
    

    您可以在其中使用“查找”实用程序填充文件列表。

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

    将为您提供每个文件的行计数。

        14
  •  1
  •   Keith Pinson sumit vedi    13 年前

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

    #!/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
    
        15
  •  1
  •   Andy    13 年前

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

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

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

    ./scriptname ~/Dropbox/project/src java
    

        16
  •  0
  •   Dutch    13 年前
    grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
    

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

    嗯!

        17
  •  0
  •   fedorqui yar    9 年前

    grep -v ^$ filename wc -l | sed -e 's/ //g' 
    
        18
  •  0
  •   jean-emmanuel    8 年前
    rgrep . | wc -l
    

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

        19
  •  -3
  •   G1i1ch    12 年前

    只是

    wc -l *.c