統計一下你寫過多少代碼


 

統計一下你寫過多少代碼

 

最近整理了一下自己從開始學習編程以來寫過的程序和代碼,林林總總,花了不少的時間,最后把一些自認為還算不錯的代碼提交到github上做一個簡單的分類和備份。當然我並不奢求它們能成為多好的開源代碼,只是希望通過這種方式分享自己的勞動成果罷了。如果大家有興趣可以訪問我的github,歡迎朋友們提出意見和建議。

在我整理代碼的時候,突發奇想地想知道自己曾經寫過多少行代碼。相信手握大量代碼的童鞋應該也有類似的想法,於是查閱資料來完成這個目標。

首先,我們需要一點時間做一下准備工作。我們需要將自己寫過的程序拷貝到一個文件夾下邊,以防我們把一些教程和示例的代碼也統計進去了,這的確需要不少精力——如果你的代碼遍布在你硬盤的各個角落的話。

為了統計代碼的行數,我們需要用到linux提供的工具wc(名字有點詭異,呵呵)。

$wc –l *.c *.h

該命令可以將當前目錄下的所有以.c.h結尾的文件的行數統計並累加。但是該工具的功能十分有限,它只能操作當前目錄下的文件,而不會去遞歸查詢子目錄。顯然統計大量的工程和文件的行數是不可行的,不過所幸的是我們可以使用find命令遞歸的查詢子目錄的文件。

$find . –iname “*.[ch]”

該命令可以將當前目錄以及子目錄下的所有以.c.h.C.H結尾的文件全部列舉出來!(有時我們的代碼的擴展名命名可能不是太規范,有可能擴展名是大寫的,使用-name是大小寫敏感查詢,使用-iname忽略大小寫)。

有了以上的命令,我們想把所有以.c.h.C.H結尾的文件的代碼行統計並累加。借助shell的管道可以輕松實現。

$find . –iname “*.[ch]” | xargs wc -l

管道“|的含義是將前邊的命令的輸出作為后邊指令的輸入,而xargs工具將find命令的輸出轉換為wc命令的參數。

以上便是統計代碼行的基本命令原型,如果統計C語言的代碼則足夠了,但這還不能滿足我們的需要。如果讀者手頭有大量的C#JavaC++、匯編代碼的話,使用find提供的功能有限的通配符並不方便。因為我們可能處理的文件格式有:.cs.java.cpp.s.asm等,如果你有很多的ASPJSP這樣的網站工程的話,可能還需要.html.css.js等格式的代碼(雖然.html文件不像是代碼……)。

為了方便處理各種文件格式,我們需要寫一段shell腳本。其基本思想是每次只搜索一種格式的文件,然后將所有的搜索結果集合到一個文件中去,最后將該文件的內容作為wc命令的參數進行行數統計即可。

#/user/bin/sh

cat /dev/null > info          #清空info

types=("*.asm" "*.s" "*.c" "*.cpp" "*.h" "*.cs" "*.java")    #所有要統計的文件類型

for i in ${types[@]}          #遍歷每個文件類型

do

find . -iname $i > tmp    #按類型(大小寫不敏感)查找,緩存到tmp

cat tmp >> info           #將查詢結果追加到info

done

sed -i 's/ /\\&/g' info       #處理文件名出現空格的情況

cat info | xargs wc -l        #統計行數

rm info tmp                   #刪除臨時文件

結合腳本,首先我們需要建立兩個臨時文件tmpinfo,前者用於記錄每個文件類型的查詢結果,后者記錄所有的查詢結果(初始清空)。然后使用types數組記錄所有要統計的文件擴展名(這里的類型匹配串一定不要重復,否則會重復統計),並使用循環依次使用find命令將結果重定向(>)到文件tmp中,然后將tmp追加(>>)到文件info。接着我們使用sed命令對info文件做一下處理——將文件內的所有空格前加上反斜杠“\。這是因為如果文件名存在空格的話,將之應用到wc命令中后會導致命令被截斷,產生錯誤,因此需要使用“\對空格轉義。最后使用管道將文件內容應用到wc命令的參數,統計即可得到最終結果。

將上述腳本文件保存后,使用chmod命令轉換為可執行權限,運行進行行數統計。

$chmod +x ./腳本文件名

運行命令,在輸出的結果中,最后一行一般都會顯示如下信息:

{總行數} {總用量}

如果統計出的的代碼文件個數較少,最后一行的總行數便是結果。然而wc命令一次處理的文件個數有限(大約3000個左右),當統計的文件過多時,它會分批進算總行數!這樣最終的總行數其實是每批統計的行數之和!我們可以使用如下命令將每批的行數信息顯示出來。

$cat info | xargs wc -l | sort -n

sort -n命令可以將文件按行大小排序,使得所有行數信息集中顯示在文件尾部。當然更好的是使用如下方式。

$cat info | xargs wc -l > tmp

$grep -rin "^[ ]*[1-9][0-9]*[ ]*總用量$" tmp

grep命令按照每批統計的結果形式識別並輸出如下形式。

{行號}: {總行數} {總用量}

當然,我們可以手工的將行數累加起來,得到最終的行數。雖然工作量不大(確實不大,即使linux的內核源碼也就十幾條數據),但是我們想讓它自動完成。

#/user/bin/sh

cat /dev/null > info         #清空info

types=("*.asm" "*.s" "*.c" "*.cpp" "*.h" "*.cs" "*.java")   #所有要統計的文件類型

for i in ${types[@]}         #遍歷每個文件類型

do

    find . -iname $i > tmp    #按類型(大小寫不敏感)查找,緩存到tmp

    cat tmp >> info           #將查詢結果追加到info

done

sed -i 's/ /\\&/g' info      #處理文件名出現空格的情況

cat info | xargs wc -l > tmp #統計行數,輸出到文件

grep -rin "^[ ]*[1-9][0-9]*[ ]*總用量$" tmp > info    #提取行數信息

let sum=0                    #總行數

while read tag count flag    #取出每一批處理結果的行數

do

    let sum=sum+count         #累加行數

done < info                  #指定讀取的文件

echo 總行數=$sum            #顯示最終總行數

rm info tmp                  #刪除臨時文件

相比與之前的腳本,我們把統計的文件的行數信息保存在tmp,然后使用grep命令將有效的行數信息保存在info,最后讀取info的每一行,取出每一批的行數,累加得到最終結果!而且由於不用向屏幕輸出大量的文件路徑信息(重定向到文件內),腳本可以更快的運行。經測試,對於linux 3.5.2 內核的源碼,該腳本執行時間約2s左右(使用time命令測試,具體情況因機器而異),統計的源碼行數為14557019行!統計linux源碼行數時, 我們也可以修改types數組,僅統計*.s*.asm*.c*.h文件,因為linux源碼里只有C和匯編代碼。

作者平時使用匯編、C/C++C#Java寫過的代碼比較多,使用上述腳本統計完全沒問題,統計結果為10W+。如果讀者還需統計其他類型的文件,可以自行修改types數組(注意不要在數組元素間加逗號!)進行統計,你是否願意一下自己的代碼行數呢?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM