今天面試時,突然被面試官問到怎樣用shell命令搞定某個文件夾下java代碼行數的統計。
想了一下,基本思路就是找到這個文件夾下面的所有java文件,然後每個文件統計一下代碼,外層套個for循環,疊加一下結果,就拿到想要的結果了。
不過顯然面試官希望我用一句shell搞定,當場暈菜了,沒搞定。回來想了一下,其實確實不是啥太難的問題。
最粗略版
- find . -name "*.java"|xargs wc -l|grep "total"|awk '{print $1}'
- find . -name "*.java"|xargs cat|wc -l #Output:37634
上面的兩句效果一樣,只不過第二種是先利用cat將多個java文件的內容合併輸出了。然後再統計。
不過兩個都有共同的毛病——連文件裏面的空行都給統計進去算作一行了。
去除空行版
- find . -name "*.java"|xargs cat|grep -v ^$|wc -l #Output:36335
但是,java代碼還有註釋呢啊?!Fuck,還得幹掉註釋!
去除註釋版
- # exclude the lines begin with //
- find . -name "*.java"|xargs cat|grep -v -e ^$ -e ^\s*\/\/.*$|wc -l #Output:36064
好,這個方法發現,以//開頭的註釋有36335-36064=271行。這裏需要注意的是,註釋行未必就以//作爲開頭,可能N個空格之後纔開始的的//,所以匹配時需要加上上面的^\s*放在開頭。
大功告成啦?扯淡!!!
java裏面註釋好幾種風格,再給你看看這個非常常見的註釋,還是會在統計結果裏面
- /**
- * @author xxx 2012-6-15 下午3:19:47
- */
咋搞?這種註釋我還真沒想好怎麼方便的除去,簡單粗暴的方法但是可以在上面grep的參數裏面再加入3個正則,分別去除以/**、*、*/開頭的行。不過我自己想着都覺得挫。不知道有沒有更好的辦法了。