在Bash中,如何计算项目中非空行的数量?
sloc
,cloc
这些程序可以用来计算这些代码行数。
在Bash中,如何计算项目中非空行的数量?
sloc
,cloc
这些程序可以用来计算这些代码行数。
Answers:
cat foo.c | sed '/^\s*$/d' | wc -l
如果您认为注释为空行:
cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
虽然,这取决于语言。
< foo.pl sed 'stuff' | wc -l
。
#!/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是要查看的文件的扩展名。任何扩展名不同的文件都将被忽略。
$
在grep(...\.js$|...
)中添加a ,否则它将匹配feature.js.swp
。
find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
使用通用的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
-e
没有必要。那是图案的正常位置,您不会对其进行任何时髦的处理。但是,如果这是您的风格,那么明确就没错。
'wc'计算行,单词,字符,因此要计算所有行(包括空白行),请使用:
wc *.py
要过滤出空行,可以使用grep:
grep -v '^\s*$' *.py | wc
'-v'告诉grep输出所有行,除了那些匹配'^'的行是行的开始'\ s *'是零或多个空格字符'$'是行的结尾* .py是我的示例您希望计数的所有文件(当前目录中的所有python文件)通过管道输出到wc。就行了。
我在回答我自己的(真正的)问题。找不到涵盖此内容的stackoverflow条目。
此命令计数非空行数。cat fileName | grep -v ^$ | wc -l
grep -v ^ $正则表达式函数忽略空行。
cat
该链没有必要:grep -v ^$ fileName | wl -l
wc -l
因为grep具有-c
:grep -vc ^$ fileName
cat 'filename' | grep '[^ ]' | wc -l
应该可以解决问题
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
awk '!/^[[:space:]]*$/{++x} END{print x}'
。或者,如果您真的讨厌底片,awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
;)
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
请享用!- 柯伦
这有点取决于项目中文件的数量。理论上您可以使用
grep -c '.' <list of files>
您可以在其中使用find实用程序填充文件列表。
grep -c '.' `find -type f`
将为您提供每个文件的行数。
脚本以递归方式计算当前目录中带有特定文件扩展名的所有非空白行:
#!/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
它仅是先前解决方案的集合。
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
给出当前目录及其子目录中所有文件的总数。
HTH!
${-[*]} + $@
,这不会与匹配。这肯定是世界上某个地方的有效代码。;)您的意思是空格。
在Linux上已经有一个名为“ wc”的程序。
只是
wc -l *.c
它为您提供了总行数和每个文件的行数。
wc
计算空行。OP希望计算非空白行。他确实想使用wc
,但是只有在使用sed
foo.c
)。对项目中的总行数有什么想法(例如,目录结构中的许多文件,但不包括二进制文件)?