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

Jon*_*ley 145 unix bash lines count nonblank

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

Mic*_*mer 182

cat foo.c | sed '/^\s*$/d' | wc -l
Run Code Online (Sandbox Code Playgroud)

如果您考虑注释空白行:

cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
Run Code Online (Sandbox Code Playgroud)

虽然,这是语言依赖.

  • 要对所有子文件夹中的所有文件执行此操作并使用"//"排除注释,请将此命令扩展为:find.-type f -name'*.c'-exec cat {} \; | sed'/ ^\s*#/ d;/^\s*$/d;/^\s*\/\// d'| wc -l (31认同)
  • 只是习惯.我从左到右阅读管道,这意味着我通常从cat开始,然后是动作,动作,动作等.显然,最终结果是一样的. (25认同)
  • 不知道为什么你在那里使用猫.使用foo.c或foo.pl作为文件名传递给sed.sed'/ ^\s*$/d'foo.c | wc -l (21认同)
  • 一般来说,UUOC并不重要,但可读性是. (18认同)
  • 你可以在没有UUOC的情况下从左到右阅读:`<foo.pl sed'stuff'| wc -l`. (10认同)
  • @Andy:给他无用的猫奖! (3认同)

Gil*_*les 51

#!/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
Run Code Online (Sandbox Code Playgroud)

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

在上面的"./blog""./ punbb""./ js/3rdparty"和"./pma"是我黑名单的文件夹,因为我没有在其中编写代码.此外,.php,.as,.sql,.css,.js是正在查看的文件的扩展名.将忽略具有不同扩展名的任何文件.


xsl*_*xsl 35

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

cloc在许多编程语言中计算空白行,注释行和源代码的物理行.它完全用Perl编写,在Perl v5.6及更高版本的标准发行版之外没有依赖项(某些外部模块的代码嵌入在cloc中),因此非常便携.

  • 当我第一次问这个问题时,“ cloc”将Python文档字符串视为代码行,这不是最理想的恕我直言。现在,现代版本的“ cloc”将Python文档字符串视为注释,我对此非常满意。 (2认同)

Spo*_*ser 27

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

我的解决方案是:

grep -cve '^\s*$' <file>
Run Code Online (Sandbox Code Playgroud)

这将在<file>中搜索与模式(-e)'^\s*$'匹配的不匹配(-v)行,这是一行的开头,后跟0或更多的空白字符,然后是在一行的末尾(即除了空白之外没有其他内容),并显示匹配行的计数(-c)而不是匹配的行本身.

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

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

config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!顺便提一下,wc确实为每个给定文件提供了一个计数,加上总数. (2认同)
  • 这是我认为最好的答案。 (2认同)
  • `-e` 不是必需的。这是图案的正常位置,您不会用它做任何奇怪的事情。但如果这是你的风格,那么明确表达也没有什么错。 (2认同)

Jon*_*ley 13

'wc'计算行,单词,字符,所以计算所有行(包括空行)使用:

wc *.py
Run Code Online (Sandbox Code Playgroud)

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

grep -v '^\s*$' *.py | wc
Run Code Online (Sandbox Code Playgroud)

'-v'告诉grep输出所有行,除了那些匹配'^'的行是'\ s'的开头''是零或者更多的空白字符'$'是行的结尾*.py是我的例子你想要计算的所有文件(当前目录中的所有python文件)管道输出到wc.就行了.

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

  • \ W不是空格匹配,它匹配非单词字符.它与\ w,单词字符相反.\ W将匹配任何非字母数字或下划线的内容,因此不会执行您在此声明的操作.你的意思是\ s (5认同)

coa*_*ine 9

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

  • 也不需要`wc -l`,因为grep具有`-c`:`grep -vc ^ $ fileName` (4认同)
  • 在此链中不需要`cat`:`grep -v ^ $ fileName | wl -l (2认同)

小智 8

cat file.txt | awk 'NF' | wc -l
Run Code Online (Sandbox Code Playgroud)

  • 喜欢这个的简单性 (2认同)

cur*_*isk 5

cat 'filename' | grep '[^ ]' | wc -l
Run Code Online (Sandbox Code Playgroud)

应该可以解决问题

  • 当您首先将文件名作为参数传递给grep时,为什么要使用cat并将文件通过管道传递到grep中? (3认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

我发布此内容是因为其他选项给了我错误的答案。这适用于我的 java 源,其中注释行以 / 或 * 开头(我在多行注释中的每一行上使用 * )。