一句shell命令搞定代碼行數統計

今天面試時,突然被面試官問到怎樣用shell命令搞定某個文件夾下java代碼行數的統計。

想了一下,基本思路就是找到這個文件夾下面的所有java文件,然後每個文件統計一下代碼,外層套個for循環,疊加一下結果,就拿到想要的結果了。

不過顯然面試官希望我用一句shell搞定,當場暈菜了,沒搞定。回來想了一下,其實確實不是啥太難的問題。

 

最粗略版

Shell代碼  收藏代碼
  1. find . -name "*.java"|xargs wc -l|grep "total"|awk '{print $1}'  
  2. find . -name "*.java"|xargs cat|wc -l    #Output:37634  

上面的兩句效果一樣,只不過第二種是先利用cat將多個java文件的內容合併輸出了。然後再統計。

不過兩個都有共同的毛病——連文件裏面的空行都給統計進去算作一行了。

去除空行版

Shell代碼  收藏代碼
  1. find . -name "*.java"|xargs cat|grep -v ^$|wc -l    #Output:36335  
這個版本靠譜一些了,可以看到去掉空行之後的統計結果變爲了:36335,比上個版本幹掉了1299行的空行。。。 

但是,java代碼還有註釋呢啊?!Fuck,還得幹掉註釋!

去除註釋版

Shell代碼  收藏代碼
  1. # exclude the lines begin with //  
  2. find . -name "*.java"|xargs cat|grep -v -e ^$ -e ^\s*\/\/.*$|wc -l    #Output:36064  

好,這個方法發現,以//開頭的註釋有36335-36064=271行。這裏需要注意的是,註釋行未必就以//作爲開頭,可能N個空格之後纔開始的的//,所以匹配時需要加上上面的^\s*放在開頭。

大功告成啦?扯淡!!!

java裏面註釋好幾種風格,再給你看看這個非常常見的註釋,還是會在統計結果裏面

Java代碼  收藏代碼
  1. /** 
  2.  * @author xxx 2012-6-15 下午3:19:47 
  3.  */  

咋搞?這種註釋我還真沒想好怎麼方便的除去,簡單粗暴的方法但是可以在上面grep的參數裏面再加入3個正則,分別去除以/**、*、*/開頭的行。不過我自己想着都覺得挫。不知道有沒有更好的辦法了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章