用于计算LOC的BASH脚本

时间:2012-11-20 21:45:13

标签: bash scripting cygwin

在我的所有源代码文件中,每个文件顶部都有一个信息“标题”,如下所示(例如Java):

/* Project: UVa Online Judge
 * Filetype: Java Source Code File
 * Filename: generic.java
 * Path: compsci/sandbox/uva_online_judge
 * Filesize: 1275 bytes
 * Date Created: 11/17/2011
 * Last Modified: Tue Nov 20, 2012  02:28PM
 * LOC: 33
 */

从BASH命令行(我在Cygwin版本1.7.16上使用GNU bash版本4.1.10)我正在尝试计算特定项目文件夹中所有源文件的总LOC(代码行)。我要去顶级项目文件夹(我的一些源代码在此文件夹的子文件夹中)并运行以下内容:

$ grep -r LOC: *

给了我以下内容:

generic.c: * LOC: 44
generic.java: * LOC: 33
solved/100/uva_100.java: * LOC: 77
solved/102/uva_102.java: * LOC: 139
solved/108/uva_108.c: * LOC: 94
solved/120/uva_120.java: * LOC: 109
solved/200/uva_200.java: * LOC: 83
solved/414/uva_414.c: * LOC: 61
solved/424/uva_424.c: * LOC: 100
solved/700/uva_700.c: * LOC: 108
solved/900/uva_900.java: * LOC: 54
unsolved/341/uva_341.java: * LOC: 349

但是我想修改那个bash脚本以实际计算总LOC,因为它上面的输出将是1251.

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

以下是使用awk执行此操作的另一种方法:

grep -r LOC: * | awk '{sum+=$NF} END{print sum}'

<强>解释

  • grep -r LOC: * - 您的问题已经显示了这一点
  • |将上一步中grep的结果传递给下一个命令
  • awk调用awk工具
  • {sum+=$NF}:对于每一行,将最后一个字段添加到sumNF代表awk中的字段数,因此$NF是具有该数字的字段的内容。
  • END{print sum}:解析完所有行后,打印总和

答案 1 :(得分:1)

您应该可以使用awk:

grep -r LOC: * | awk 'BEGIN{sum=0}{sum=sum+$4}END{print sum}'

答案 2 :(得分:1)

尝试这样做:

bc <<< $(tr ' ' '+' <<< $(grep -r '^ *\* *LOC:' | cut -d ' ' -f4))

或者

c=0
grep -r '^ *\* *LOC:' | cut -d ' ' -f4 | while read a; do
    ((c+=$a))
done

echo "$c lines"

答案 3 :(得分:0)

你可以通过设置$ IFS:

来使用一个可爱的技巧
total=$(set -- $(grep -hoP '(?<=LOC: )\d+' *); IFS=+; bc <<< "$*")

假设cygwin有GNU grep