统计一下你写过多少代码
?
最近整理了一下自己從開始學(xué)習(xí)編程以來寫過的程序和代碼,林林總總,花了不少的時(shí)間,最后把一些自認(rèn)為還算不錯(cuò)的代碼提交到github上做一個(gè)簡(jiǎn)單的分類和備份。當(dāng)然我并不奢求它們能成為多好的開源代碼,只是希望通過這種方式分享自己的勞動(dòng)成果罷了。如果大家有興趣可以訪問我的github,歡迎朋友們提出意見和建議。
在我整理代碼的時(shí)候,突發(fā)奇想地想知道自己曾經(jīng)寫過多少行代碼。相信手握大量代碼的童鞋應(yīng)該也有類似的想法,于是查閱資料來完成這個(gè)目標(biāo)。
首先,我們需要一點(diǎn)時(shí)間做一下準(zhǔn)備工作。我們需要將自己寫過的程序拷貝到一個(gè)文件夾下邊,以防我們把一些教程和示例的代碼也統(tǒng)計(jì)進(jìn)去了,這的確需要不少精力——如果你的代碼遍布在你硬盤的各個(gè)角落的話。
為了統(tǒng)計(jì)代碼的行數(shù),我們需要用到linux提供的工具wc(名字有點(diǎn)‘詭異’,呵呵)。
$wc –l *.c *.h
該命令可以將當(dāng)前目錄下的所有以.c、.h結(jié)尾的文件的行數(shù)統(tǒng)計(jì)并累加。但是該工具的功能十分有限,它只能操作當(dāng)前目錄下的文件,而不會(huì)去遞歸查詢子目錄。顯然統(tǒng)計(jì)大量的工程和文件的行數(shù)是不可行的,不過所幸的是我們可以使用find命令遞歸的查詢子目錄的文件。
$find . –iname “*.[ch]”
該命令可以將當(dāng)前目錄以及子目錄下的所有以.c、.h、.C、.H結(jié)尾的文件全部列舉出來!(有時(shí)我們的代碼的擴(kuò)展名命名可能不是太規(guī)范,有可能擴(kuò)展名是大寫的,使用-name是大小寫敏感查詢,使用-iname忽略大小寫)。
有了以上的命令,我們想把所有以.c、.h、.C、.H結(jié)尾的文件的代碼行統(tǒng)計(jì)并累加。借助shell的管道可以輕松實(shí)現(xiàn)。
$find . –iname “*.[ch]” | xargs wc -l
管道“|”的含義是將前邊的命令的輸出作為后邊指令的輸入,而xargs工具將find命令的輸出轉(zhuǎn)換為wc命令的參數(shù)。
以上便是統(tǒng)計(jì)代碼行的基本命令原型,如果統(tǒng)計(jì)C語(yǔ)言的代碼則足夠了,但這還不能滿足我們的需要。如果讀者手頭有大量的C#、Java、C++、匯編代碼的話,使用find提供的功能有限的通配符并不方便。因?yàn)槲覀兛赡芴幚淼奈募袷接?#xff1a;.cs、.java、.cpp、.s、.asm等,如果你有很多的ASP、JSP這樣的網(wǎng)站工程的話,可能還需要.html、.css、.js等格式的代碼(雖然.html文件不像是代碼……)。
為了方便處理各種文件格式,我們需要寫一段shell腳本。其基本思想是每次只搜索一種格式的文件,然后將所有的搜索結(jié)果集合到一個(gè)文件中去,最后將該文件的內(nèi)容作為wc命令的參數(shù)進(jìn)行行數(shù)統(tǒng)計(jì)即可。
#/user/bin/sh
cat /dev/null > info?????????#清空info
types=("*.asm" "*.s" "*.c" "*.cpp" "*.h" "*.cs" "*.java")???#所有要統(tǒng)計(jì)的文件類型
for i in ${types[@]}?????????#遍歷每個(gè)文件類型
do
find . -iname $i > tmp???#按類型(大小寫不敏感)查找,緩存到tmp
cat tmp >> info??????????#將查詢結(jié)果追加到info
done
sed -i 's/ /\\&/g' info??????#處理文件名出現(xiàn)空格的情況
cat info | xargs wc -l???????#統(tǒng)計(jì)行數(shù)
rm info tmp??????????????????#刪除臨時(shí)文件
結(jié)合腳本,首先我們需要建立兩個(gè)臨時(shí)文件tmp和info,前者用于記錄每個(gè)文件類型的查詢結(jié)果,后者記錄所有的查詢結(jié)果(初始清空)。然后使用types數(shù)組記錄所有要統(tǒng)計(jì)的文件擴(kuò)展名(這里的類型匹配串一定不要重復(fù),否則會(huì)重復(fù)統(tǒng)計(jì)),并使用循環(huán)依次使用find命令將結(jié)果重定向(>)到文件tmp中,然后將tmp追加(>>)到文件info。接著我們使用sed命令對(duì)info文件做一下處理——將文件內(nèi)的所有空格前加上反斜杠“\”。這是因?yàn)槿绻募嬖诳崭竦脑?#xff0c;將之應(yīng)用到wc命令中后會(huì)導(dǎo)致命令被截?cái)?#xff0c;產(chǎn)生錯(cuò)誤,因此需要使用“\”對(duì)空格轉(zhuǎn)義。最后使用管道將文件內(nèi)容應(yīng)用到wc命令的參數(shù),統(tǒng)計(jì)即可得到最終結(jié)果。
將上述腳本文件保存后,使用chmod命令轉(zhuǎn)換為可執(zhí)行權(quán)限,運(yùn)行進(jìn)行行數(shù)統(tǒng)計(jì)。
$chmod +x ./腳本文件名
運(yùn)行命令,在輸出的結(jié)果中,最后一行一般都會(huì)顯示如下信息:
{總行數(shù)} {總用量}
如果統(tǒng)計(jì)出的的代碼文件個(gè)數(shù)較少,最后一行的總行數(shù)便是結(jié)果。然而wc命令一次處理的文件個(gè)數(shù)有限(大約3000個(gè)左右),當(dāng)統(tǒng)計(jì)的文件過多時(shí),它會(huì)分批進(jìn)算總行數(shù)!這樣最終的總行數(shù)其實(shí)是每批統(tǒng)計(jì)的行數(shù)之和!我們可以使用如下命令將每批的行數(shù)信息顯示出來。
$cat info | xargs wc -l | sort -n
sort -n命令可以將文件按行大小排序,使得所有行數(shù)信息集中顯示在文件尾部。當(dāng)然更好的是使用如下方式。
$cat info | xargs wc -l > tmp
$grep -rin "^[ ]*[1-9][0-9]*[ ]*總用量$" tmp
grep命令按照每批統(tǒng)計(jì)的結(jié)果形式識(shí)別并輸出如下形式。
{行號(hào)}: {總行數(shù)} {總用量}
當(dāng)然,我們可以手工的將行數(shù)累加起來,得到最終的行數(shù)。雖然工作量不大(確實(shí)不大,即使linux的內(nèi)核源碼也就十幾條數(shù)據(jù)),但是我們想讓它自動(dòng)完成。
#/user/bin/sh
cat /dev/null > info????????#清空info
types=("*.asm" "*.s" "*.c" "*.cpp" "*.h" "*.cs" "*.java")??#所有要統(tǒng)計(jì)的文件類型
for i in ${types[@]}????????#遍歷每個(gè)文件類型
do
??? find . -iname $i > tmp??? #按類型(大小寫不敏感)查找,緩存到tmp
??? cat tmp >> info?????????? #將查詢結(jié)果追加到info
done
sed -i 's/ /\\&/g' info?????#處理文件名出現(xiàn)空格的情況
cat info | xargs wc -l > tmp#統(tǒng)計(jì)行數(shù),輸出到文件
grep -rin "^[ ]*[1-9][0-9]*[ ]*總用量$" tmp > info???#提取行數(shù)信息
let sum=0???????????????????#總行數(shù)
while read tag count flag???#取出每一批處理結(jié)果的行數(shù)
do
??? let sum=sum+count???????? #累加行數(shù)
done < info?????????????????#指定讀取的文件
echo 總行數(shù)=$sum行???????????#顯示最終總行數(shù)
rm info tmp?????????????????#刪除臨時(shí)文件
相比與之前的腳本,我們把統(tǒng)計(jì)的文件的行數(shù)信息保存在tmp,然后使用grep命令將有效的行數(shù)信息保存在info,最后讀取info的每一行,取出每一批的行數(shù),累加得到最終結(jié)果!而且由于不用向屏幕輸出大量的文件路徑信息(重定向到文件內(nèi)),腳本可以更快的運(yùn)行。經(jīng)測(cè)試,對(duì)于linux3.5.2內(nèi)核的源碼,該腳本執(zhí)行時(shí)間約2s左右(使用time命令測(cè)試,具體情況因機(jī)器而異),統(tǒng)計(jì)的源碼行數(shù)為14557019行!統(tǒng)計(jì)linux源碼行數(shù)時(shí),我們也可以修改types數(shù)組,僅統(tǒng)計(jì)*.s、*.asm、*.c、*.h文件,因?yàn)?span style="font-family:Times New Roman">linux源碼里只有C和匯編代碼。
作者平時(shí)使用匯編、 C/C++、 C#、 Java寫過的代碼比較多,使用上述腳本統(tǒng)計(jì)完全沒問題,統(tǒng)計(jì)結(jié)果為 10W+。如果讀者還需統(tǒng)計(jì)其他類型的文件,可以自行修改 types數(shù)組(注意不要在數(shù)組元素間加逗號(hào)!)進(jìn)行統(tǒng)計(jì),你是否愿意 “秀 ”一下自己的代碼行數(shù)呢?總結(jié)
以上是生活随笔為你收集整理的统计一下你写过多少代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper C API 指南
- 下一篇: 高性能网络编程7--tcp连接的内存使用