快速統計C/C++項目有效代碼行數(排除空行、註釋),是代碼審計、工作量評估的常見需求。本文分析一個Bash腳本的實現邏輯,揭示其局限性,並給出生產級替代方案。
sed '/^[[:blank:]]*$/d'sed '/^[[:blank:]]*\/\//d'/*行號 → start.txt*/行號 → end.txtpaste合並配對sed '${START},${END}d'刪除wc -l/* 註釋開始 */ int x = 1; /* 註釋結束 */
printf("hello"); /* 行內註釋 */
無法處理同一行包含代碼和註釋的情況,會誤刪有效代碼。且grep -n只匹配行首模式,漏掉縮進的註釋。
用awk實現單遍掃描狀態機,正確處理嵌套、字符串字面量、行內註釋:
awk '
BEGIN { in_block=0; in_string=0; in_char=0; count=0 }
/\/\*/ && !in_string && !in_char { in_block=1; gsub(/\/\*.*\*\//,"") }
/\*\// && in_block && !in_string && !in_char { in_block=0; gsub(/.*\*\//,"") }
in_block { next }
/\/\// && !in_string && !in_char { gsub(/\/\/.*/,"") }
/^[[:space:]]*$/ { next }
{ count++ }
END { print count }
' "$1"
| 工具 | 語言 | 特性 | 安裝 |
|---|---|---|---|
| cloc | Perl | 多語言、報告豐富、並行處理 | apt/yum/brew install cloc |
| scc | Go | 極快、Git感知、複雜度估算 | go install github.com/boyter/scc@latest |
| tokei | Rust | 高速、彩色輸出、JSON導出 | cargo install tokei |
| LOC | Rust | 簡單、標準輸出、CI友好 | cargo install loc |
cloc --json生成機器可讀報告git diff --numstat配合cloc --diff--exclude-dir=generated,protobuf,third_partyBash腳本適合臨時小規模統計,但面對真實項目的複雜語法(字符串內/*、行內註釋、嵌套註釋、預處理指令)無能為力。現代專用工具基於完整詞法分析,準確度與速度雙贏。建議團隊統一接入cloc或scc到構建流程,獲得可信的代碼度量基線。