2012-11-20 39 views
1

在我所有的源代碼文件,我有一個信息的「頭」的,看起來像這樣(在Java示例)的每個文件的頂部:bash腳本來算LOC

/* 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 version 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 

但我'd想要修改該bash腳本以實際計算總LOC,因爲上面的輸出是1251.

感謝您的幫助!

+0

不回答你的問題,但它聽起來像[cloc](http://cloc.sourceforge.net/)可能會在你的情況下有用 – Martin

回答

1

你應該能夠用awk:

grep -r LOC: * | awk 'BEGIN{sum=0}{sum=sum+$4}END{print sum}' 
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" 
+0

增加'bc'解決方案 –

2

這裏的另一種方式與awk做到這一點:

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

說明:

  • grep -r LOC: * - 你的問題已經顯示了這樣做
  • |管道的結果從上一步下一個命令
  • awk grep的調用AWK工具
  • {sum+=$NF}:對於每行,將最後一個字段添加到sumNF代表awk中的字段數,因此$NF是具有該編號的字段的內容。
  • END{print sum}:所有線路都被解析後,打印總和
+0

更多簡潔的解決方案和更好的解釋比我自己的答案! – atkretsch

0

您可以通過設置使用一個可愛的把戲$ IFS:

total=$(set -- $(grep -hoP '(?<=LOC:)\d+' *); IFS=+; bc <<< "$*") 

假設cygwin的有GNU的grep