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

问题描述 投票:0回答:21

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

bash unix count lines nonblank
21个回答
215
投票
cat foo.c | sed '/^\s*$/d' | wc -l

如果您考虑注释空行:

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

尽管这取决于语言。


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


41
投票

有很多方法可以使用常见的 shell 实用程序来执行此操作。

我的解决方案是:

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

这将搜索 不匹配 (-v) 行中与模式 (-e) '^\s*$' 匹配的行,该行是行的开头,后跟 0 个或多个空白字符,最后是行尾(即除了空格之外没有任何内容),并显示匹配行的计数 (-c) 而不是匹配行本身。

与涉及管道传输到

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

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

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

40
投票

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

cloc 计算空行、注释的数量 源线和物理线 许多编程语言的代码。它 完全用 Perl 编写,没有 标准之外的依赖关系 Perl v5.6 及更高版本的发行版 (一些外部模块的代码是 嵌入 cloc 中),所以相当 便携式。


23
投票

此命令计算非空行的数量。

cat fileName | grep -v ^$ | wc -l

grep -v ^$ 正则表达式功能是忽略空行。


14
投票

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

wc *.py

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

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

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

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


14
投票
cat file.txt | awk 'NF' | wc -l

6
投票
cat 'filename' | grep '[^ ]' | wc -l

应该可以很好地完成任务


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


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

3
投票

这是一个 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

享受吧! --库兰


2
投票
rgrep . | wc -l

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


2
投票

最简洁的命令是

grep -vc ^$ fileName

使用

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


1
投票

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

grep -c '.' <list of files>

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

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

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


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

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

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


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

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

哈!


0
投票

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

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

0
投票

试试这个:

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

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


0
投票

使用 Perl:

perl -ne '!/^\s*$/ && ++$i; eof && printf "%d\n", $i'
# or
perl -ne '++$i if not /^\s*$/; printf "%d\n", $i if eof'
# or
perl -ne '++$i if ! /^\s*$/; printf "%d\n", $i if eof'
# ...

其中

/PATTERN/
是您想要跳过的任何内容。

使用

bash

while IFS= read -r n; do 
    ! [[ "$n" =~ ^\s*# ]] && ((++i))
done
printf '%d\n' $i

-3
投票

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

只是

wc -l *.c 

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

© www.soinside.com 2019 - 2024. All rights reserved.