文法:wc [選項] 檔案…
說明:該命令統計給定檔案中的位元組數、字數、行數。如果沒有給出檔案名稱,則從標準輸入讀取。wc同時也給出所有指定檔案的總統計數。字是由空白字元區分開的最大字串。
該命令各選項含義如下:
- c 統計位元組數。
- l 統計行數。
- w 統計字數。
這些選項可以組合使用。
輸出資料行的順序和數目不受選項的順序和數目的影響。
總是按下述順序顯示並且每項最多一列。
行數、字數、位元組數、檔案名稱
如果命令列中沒有檔案名稱,則輸出中不出現檔案名稱。
例如:
$ wc - lcw file1 file2
4 33 file1
7 52 file2
11 11 85 total
舉例分析:
1.統計demo目錄下,js檔案數量: find demo/ -name "*.js" |wc -l
2.統計demo目錄下所有js檔案程式碼數: find demo/ -name "*.js" |xargs cat|wc -l 或 wc -l `find ./ -name "*.js"`|tail -n1
3.統計demo目錄下所有js檔案程式碼數,過濾了空行: find /demo -name "*.js" |xargs cat|grep -v ^$|wc -l
今天面試時,突然被面試官問到怎樣用shell命令搞定某個檔案夾下java程式碼數的統計。
想了一下,基本思路就是找到這個檔案夾下面的所有java檔案,然後每個檔案統計一下代碼,外層套個for迴圈,疊加一下結果,就拿到想要的結果了。
不過顯然面試官希望我用一句shell搞定,當場暈菜了,沒搞定。回來想了一下,其實確實不是啥太難的問題。
最粗略版
Shell代碼 find . -name "*.java"|xargs wc -l|grep "total"|awk '{print $1}' find . -name "*.java"|xargs cat|wc -l #Output:37634
上面的兩句效果一樣,只不過第二種是先利用cat將多個java檔案的內容合并輸出了。然後再統計。
不過兩個都有共同的毛病——連檔案裡面的空行都給統計進去算作一行了。
去除空行版
Shell代碼 find . -name "*.java"|xargs cat|grep -v ^$|wc -l #Output:36335 這個版本靠譜一些了,可以看到去掉空行之後的統計結果變為了:36335,比上個版本幹掉了1299行的空行。。。
但是,java代碼還有注釋呢啊。。Fuck,還得幹掉注釋。
去除注釋版
Shell代碼 # 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裡面注釋好幾種風格,再給你看看這個非常常見的注釋,還是會在統計結果裡面 Java代碼 /** * @author xxx 2012-6-15 下午3:19:47 */
咋搞。這種注釋我還真沒想好怎麼方便的除去,簡單粗暴的方法但是可以在上面grep的參數裡面再加入3個正則,分別去除以/**、*、*/開頭的行。不過我自己想著都覺得挫。不知道有沒有更好的辦法了。
原文連結:
http://www.cnblogs.com/fullhouse/archive/2011/07/17/2108786.html
http://hittyt.iteye.com/blog/1700584