Bash 中的 count (非空)行代码

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

147650 次浏览
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
cat foo.c | sed '/^\s*$/d' | wc -l

如果你考虑注释空行:

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

不过,这取决于语言。

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

wc *.py

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

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

’-v’告诉 grep 输出除匹配的行之外的所有行 “ ^”是一行的开头 S *’是零个或多个空格字符 “ $”是一行的结尾 * . py 是我的示例,适用于您希望计数的所有文件(当前目录中的所有 python 文件) 管道输出到 wc。你可以走了。

我在回答我自己的(真实的)问题。找不到一个堆栈溢出条目涵盖了这一点。

如果您不想使用 shell 脚本,请尝试使用 CLOC:

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

有很多方法可以做到这一点,使用通用的 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
cat 'filename' | grep '[^ ]' | wc -l

应该没问题

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

grep -c '.' <list of files>

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

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

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

#!/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

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

在上述”。/博客」。“/Punbb”。/js/3rdparty”和“。/pma”是我列入黑名单的文件夹,因为我没有在其中编写代码。还有。菲律宾。作为。我..。CSS.Js 是正在查看的文件的扩展名。任何具有不同扩展名的文件都将被忽略。

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

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

哈!

这样可以计算行数而不计算空行数:

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

脚本可以递归地计算工作目录中具有某个文件扩展名的所有非空行:

#!/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

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

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

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

在 Linux 上已经有一个名为“ wc”的程序来处理这个问题。

只是

wc -l *.c

它给出了每个文件的总行数和行数。

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 脚本。它递归地遍历源树,并且排除使用“//”的空行和单行注释。

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

这个命令计数非空行数。 < br > cat fileName | grep -v ^$ | wc -l < br > grep-v ^ $正则表达式函数忽略空行。

rgrep . | wc -l

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

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

最简洁的命令是

grep -vc ^$ fileName

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

试试这个:

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

它很容易记住,也不包括空行和注释行。