统计一下你写过多少代码
?
最近整理了一下自己從開始學習編程以來寫過的程序和代碼,林林總總,花了不少的時間,最后把一些自認為還算不錯的代碼提交到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#、Java、C++、匯編代碼的話,使用find提供的功能有限的通配符并不方便。因為我們可能處理的文件格式有:.cs、.java、.cpp、.s、.asm等,如果你有很多的ASP、JSP這樣的網站工程的話,可能還需要.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??????????????????#刪除臨時文件
結合腳本,首先我們需要建立兩個臨時文件tmp和info,前者用于記錄每個文件類型的查詢結果,后者記錄所有的查詢結果(初始清空)。然后使用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的每一行,取出每一批的行數,累加得到最終結果!而且由于不用向屏幕輸出大量的文件路徑信息(重定向到文件內),腳本可以更快的運行。經測試,對于linux3.5.2內核的源碼,該腳本執行時間約2s左右(使用time命令測試,具體情況因機器而異),統計的源碼行數為14557019行!統計linux源碼行數時,我們也可以修改types數組,僅統計*.s、*.asm、*.c、*.h文件,因為linux源碼里只有C和匯編代碼。
作者平時使用匯編、 C/C++、 C#、 Java寫過的代碼比較多,使用上述腳本統計完全沒問題,統計結果為 10W+。如果讀者還需統計其他類型的文件,可以自行修改 types數組(注意不要在數組元素間加逗號!)進行統計,你是否愿意 “秀 ”一下自己的代碼行數呢?總結
以上是生活随笔為你收集整理的统计一下你写过多少代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper C API 指南
- 下一篇: 高流量大并发Linux TCP性能调优