bash에서 (공백이 아닌) 코드 줄 수


151

Bash에서 프로젝트에서 공백이 아닌 코드 줄 수를 어떻게 계산합니까?


1
아래의 많은 솔루션은 하나의 파일 (예 :)에서만 작동합니다 foo.c. 프로젝트의 총 줄 수 (예 : 디렉토리 구조의 많은 파일 및 이진 파일 제외)에 대한 생각이 있습니까?
퍼즐을 풀기

5
@solvingPuzzles 나는 그 부분에 대답 할 수 있다고 생각합니다. 하나의 파일에서 작동하는 솔루션 (예 : "cat FILE | sed blah")의 경우, "cat FILE"을 조작 할 파일 이름을 나열하는 명령 (예 : "find. -name '*)으로 바꾸어 많은 파일에서 작업 할 수 있습니다. .py ' "를 입력하고"xargs cat "에 파이프하십시오. 예 : "find. -name '* .py'| xargs cat | sed '/ ^ \ s * $ / d'| wc -l"
Jonathan Hartley

2
@JonathanHartley @solvingPuzzles이 또한 같은 프로그램입니다 sloccloc그 코드 라인 수를 할 여기가.
AsTeR

OP here : 처음이 문제를 물었을 때 'cloc'은 Python 코드에서 잘 작동하지 않았습니다. 요즘은 훌륭합니다.
Jonathan Hartley

cloc는 npm 모듈로도 사용할 수 있으며 많은 시간을 절약합니다.
Krishna Vedula

답변:


193
cat foo.c | sed '/^\s*$/d' | wc -l

그리고 주석을 빈 줄로 생각하면 :

cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l

그러나 그것은 언어에 달려 있습니다.


24
왜 고양이를 사용하는지 모르겠습니다. sed에 전달할 파일 이름으로 foo.c 또는 foo.pl을 사용하십시오. sed '/ ^ \ s * $ / d'foo.c | 화장실-l
앤디 레스터

28
그냥 습관. 파이프 라인을 왼쪽에서 오른쪽으로 읽습니다. 이는 일반적으로 고양이로 시작한 다음 동작, 동작, 동작 등을 의미합니다. 최종 결과는 동일합니다.
Michael Cramer

32
모든 서브 폴더의 모든 파일에 대해이를 수행하고 '//'로 주석을 제외하려면이 명령을 다음으로 확장하십시오. -유형 f-이름 '* .c'-exec cat {} \; | sed '/ ^ \ s * # / d; / ^ \ s * $ / d; / ^ \ s * \ / \ // d'| wc -l
Benjamin Intal

11
UUOC :없이 왼쪽에서 오른쪽으로 읽을 수 있습니다 < foo.pl sed 'stuff' | wc -l.
jw013

22
일반적으로 UUOC는 중요하지 않지만 가독성은 중요합니다.
andersand

52
#!/bin/bash
find . -path './pma' -prune -o -path './blog' -prune -o -path './punbb' -prune -o -path './js/3rdparty' -prune -o -print | egrep '\.php|\.as|\.sql|\.css|\.js' | grep -v '\.svn' | xargs cat | sed '/^\s*$/d' | wc -l

위의 내용은 프로젝트 (현재 폴더와 모든 하위 폴더를 재귀 적으로)에 대한 총 코드 줄 수 (공백 줄 제거)를 제공합니다.

위의 "./blog" "./punbb" "./js/3rdparty"및 "./pma"는 코드를 작성하지 않았기 때문에 블랙리스트에있는 폴더입니다. 또한 .php, .as, .sql, .css, .js는보고있는 파일의 확장자입니다. 확장자가 다른 파일은 무시됩니다.


1
Rails 앱의 변형 : find. -path './log'-prune -o -path './trunk'-prune -o -path './branches'-prune -o -path './vendor'-prune -o -path './tmp '-prune -o -print | egrep '\ .rb | \ .erb | \ .css | \ .js | \ .yml'| grep -v 'svn'| xargs 고양이 | sed '/ ^ \ s * $ / d'| wc -l
poseid

1
$grep ( ...\.js$|...) 에 a를 추가해야합니다 feature.js.swp. 그렇지 않으면 일치 합니다.
Xeoncross

고정을 잊었으므로 잘못된 파일이 포함됩니다. 더 정박 한 버전의 앵커링 :find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Mark Jeronimus

36

쉘 스크립트가 아닌 다른 것을 사용하려면 CLOC를 시도 하십시오 .

cloc는 많은 프로그래밍 언어에서 빈 줄, 주석 줄 및 소스 코드의 실제 줄을 계산합니다. 그것은 Perl v5.6 이상의 표준 배포판 (외부 모듈의 코드가 cloc에 내장되어 있음) 외부에 의존하지 않고 완전히 Perl로 작성되었으므로 이식성이 뛰어납니다.


2
내가이 질문을 처음 물었을 때 'cloc'은 Python docstring을 코드 라인으로 계산했는데, 이는 최적이 아닌 IMHO였습니다. 최신 버전의 'cloc'은 이제 파이썬 docstring을 주석으로 계산합니다.
Jonathan Hartley

이것이 정답입니다! 방금 cloc을 시도했지만 제대로 작동합니다.
LeeMobile

31

공통 쉘 유틸리티를 사용하여이를 수행하는 많은 방법이 있습니다.

내 해결책은 다음과 같습니다.

grep -cve '^\s*$' <file>

이것은 <file>에서 줄과 일치하지 않는 (-v) 줄을 검색합니다. '^ \ s * $'는 줄의 시작 부분이며 그 뒤에 공백 문자가 0 개 이상입니다. 줄 끝까지 (즉, 공백 이외의 내용 없음) 일치하는 줄 대신 일치하는 줄 수 (-c)를 표시합니다.

로 파이핑하는 방법에 비해이 방법의 장점은 wc여러 파일을 지정하고 각 파일에 대해 별도의 수를 얻을 수 있다는 것입니다.

$ grep -cve '^\s*$' *.hh

config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39

2
감사! 또한, wc는 주어진 각 파일의 수와 총계를 제공합니다.
Jonathan Hartley

1
표준으로 하나의 파일로 간주하므로 파이프로 연결하지 않아도됩니다.
SpoonMeiser 2009

이것은 내 의견으로는 가장 좋은 대답입니다.
simhumileco

-e필요가 없습니다. 그것은 패턴의 정상적인 위치입니다. 그리고 당신은 그것으로 펑키하지 않습니다. 그러나 그것이 당신의 스타일이라면 명백한 것이 잘못은 아닙니다.
Jacktose

13

'wc'는 줄, 단어, 문자를 계산하므로 모든 줄 (빈 줄 포함)을 계산하려면 다음을 사용하십시오.

wc *.py

빈 줄을 걸러 내려면 grep을 사용할 수 있습니다.

grep -v '^\s*$' *.py | wc

'-v'는 '^'와 일치하는 행을 제외한 모든 행을 출력하도록 grep에 지시합니다. '\ s *'는 0 이상의 공백 문자입니다. '$'는 행의 끝입니다. * .py는 계산하려는 모든 파일 (현재 dir의 모든 python 파일) 파이프 출력을 wc로 보냅니다. 나가.

나는 내 자신의 (정품) 질문에 대답하고 있습니다. 이것을 다루는 stackoverflow 항목을 찾을 수 없습니다.


5
\ W는 공백과 일치하지 않으며 단어가 아닌 문자와 일치합니다. 단어 문자 \ w와 반대입니다. \ W 영숫자 나 밑줄이 아닌 모든 항목과 일치하므로 여기에서 주장하는 것을 수행하지 않습니다. 당신의 평균 \ S
SpoonMeiser

9

이 명령은 비 공백 행 수를 계산합니다.
cat fileName | grep -v ^$ | wc -l
grep -v ^ $ 정규식 함수는 빈 줄을 무시합니다.


이 답변은 가장 간단합니다
samthebest

2
cat이 체인 에는 필요가 없습니다 :grep -v ^$ fileName | wl -l
Aethalides

7
wc -lgrep도 가지고 있기 때문에 필요가 없습니다 -c:grep -vc ^$ fileName
Jacktose


5
cat 'filename' | grep '[^ ]' | wc -l

트릭을 잘해야합니다.


3
파일 이름을 grep의 인수로 전달할 수있는 경우 cat을 사용하여 파일을 grep에 파이프하는 이유는 무엇입니까?
SpoonMeiser

사실, 그것은 본질적으로 ... 당신의 솔루션과 동일 대신 역 사용하여 내가 주위가 그냥 오래된 별명 않습니다이다
curtisk

4
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"

1
나는 문자 그대로 awk 스크립트에서 사전 증가를 사용하는 것을 본 적이 없기 때문에 이것을 투표했습니다. 그러나 불행히도 이것은 빈 줄만 계산합니다. :) 당신은 의미 awk '!/^[[:space:]]*$/{++x} END{print x}'합니다. 또는, 당신이 정말로 부정적인 것을 싫어한다면 awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}';)
dannysauer

4
grep -cvE '(^\s*[/*])|(^\s*$)' foo

-c = count
-v = exclude
-E = extended regex
'(comment lines) OR (empty lines)'
where
^    = beginning of the line
\s   = whitespace
*    = any number of previous characters or none
[/*] = either / or *
|    = OR
$    = end of the line

다른 옵션이 나를 위해 잘못된 대답을했기 때문에이 게시물을 게시했습니다. 이것은 주석 줄이 / 또는 *로 시작하는 Java 소스에서 작동했습니다 (여러 줄 주석의 모든 줄에서 *를 사용합니다).


이것은 실행 가능한 솔루션입니다. 주의 할 사항 : 여러 줄 주석을 포함하지 않습니다
Amol

2

다음은 프로젝트의 코드 줄을 세는 Bash 스크립트입니다. 소스 트리를 재귀 적으로 탐색하며 "//"를 사용하는 빈 줄과 한 줄 주석은 제외합니다.

# $excluded is a regex for paths to exclude from line counting
excluded="spec\|node_modules\|README\|lib\|docs\|csv\|XLS\|json\|png"

countLines(){
  # $total is the total lines of code counted
  total=0
  # -mindepth exclues the current directory (".")
  for file in `find . -mindepth 1 -name "*.*" |grep -v "$excluded"`; do
    # First sed: only count lines of code that are not commented with //
    # Second sed: don't count blank lines
    # $numLines is the lines of code
    numLines=`cat $file | sed '/\/\//d' | sed '/^\s*$/d' | wc -l`

    # To exclude only blank lines and count comment lines, uncomment this:
    #numLines=`cat $file | sed '/^\s*$/d' | wc -l`

    total=$(($total + $numLines))
    echo "  " $numLines $file
  done
  echo "  " $total in total
}

echo Source code files:
countLines
echo Unit tests:
cd spec
countLines

내 프로젝트 의 출력 결과는 다음과 같습니다 .

Source code files:
   2 ./buildDocs.sh
   24 ./countLines.sh
   15 ./css/dashboard.css
   53 ./data/un_population/provenance/preprocess.js
   19 ./index.html
   5 ./server/server.js
   2 ./server/startServer.sh
   24 ./SpecRunner.html
   34 ./src/computeLayout.js
   60 ./src/configDiff.js
   18 ./src/dashboardMirror.js
   37 ./src/dashboardScaffold.js
   14 ./src/data.js
   68 ./src/dummyVis.js
   27 ./src/layout.js
   28 ./src/links.js
   5 ./src/main.js
   52 ./src/processActions.js
   86 ./src/timeline.js
   73 ./src/udc.js
   18 ./src/wire.js
   664 in total
Unit tests:
   230 ./ComputeLayoutSpec.js
   134 ./ConfigDiffSpec.js
   134 ./ProcessActionsSpec.js
   84 ./UDCSpec.js
   149 ./WireSpec.js
   731 in total

즐겨! - 커란


1

그것은 프로젝트에있는 파일 수에 달려 있습니다. 이론적으로 당신은 사용할 수 있습니다

grep -c '.' <list of files>

find 유틸리티를 사용하여 파일 목록을 채울 수있는 위치.

grep -c '.' `find -type f`

파일 당 줄 수를 줄 것입니다.


1
. 공백과 일치합니다. 이 솔루션은 공백 만 포함하는 줄이 공백이 아닌 줄로 간주되는 경우에만 작동합니다. 기술적으로는 그렇습니다.
SpoonMeiser

1

현재 디렉토리에서 특정 파일 확장자를 가진 모든 비 공백 행을 재귀 적으로 계산하는 스크립트 :

#!/usr/bin/env bash
(
echo 0;
for ext in "$@"; do
    for i in $(find . -name "*$ext"); do
        sed '/^\s*$/d' $i | wc -l ## skip blank lines
        #cat $i | wc -l; ## count all lines
        echo +;
    done
done
echo p q;
) | dc;

샘플 사용법 :

./countlines.sh .py .java .html

레시피의 "비 공백"부분에 대해서는 @Andy Lester (의견에 +1)로 감사드립니다.
Keith Pinson 1

(약간 더 장황한) "비 공백 (non-blank)"솔루션을 처음 게시 해 주신 @Michael Cramer (귀하의 게시물에 +1)에 감사드립니다.
Keith Pinson

1

프로젝트 전체에서 주어진 파일 확장자의 모든 파일에 대한 모든 비 공백 행의 합계를 원할 경우 :

while read line
do grep -cve '^\s*$' "$line"
done <  <(find $1 -name "*.$2" -print) | awk '{s+=$1} END {print s}'

첫 번째 arg는 프로젝트의 기본 디렉토리이고, 두 번째는 파일 확장자입니다. 샘플 사용법 :

./scriptname ~/Dropbox/project/src java

이전 솔루션 모음에 지나지 않습니다.


이것은 각 파일에서 한 줄에 한 번 grep을 실행하여 가장 많은 수의 포크 + 실행 호출에 대한 상을 얻습니다. ;)
dannysauer

0
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt

현재 디렉토리 및 해당 서브 디렉토리의 모든 파일에 대한 집계 수를 제공합니다.

HTH!


\ W는 단어가 아닌 문자입니다. ${-[*]} + $@예를 들어 같은 줄과 일치하지 않습니다 . 세계 어느 곳에서나 유효한 코드입니다. ;) 당신은 공간을 의미합니다.
dannysauer

0

이것은 빈 줄을 세지 않고 줄 수를 나타냅니다.

grep -v ^$ filename wc -l | sed -e 's/ //g' 

0
rgrep . | wc -l

현재 작업 디렉토리에서 비 공백 행 수를 제공합니다.


-3

리눅스에는 이미 'wc'라는 프로그램이 있습니다.

다만

wc -l *.c 

각 파일의 총 줄과 줄을 제공합니다.


3
야. 'wc'자체는 하위 디렉토리를 검색하지 않으며 질문에서 명시 적으로 요청한 빈 줄을 필터링하지 않습니다.
Jonathan Hartley

wc빈 줄을 계산합니다. OP는 공백이 아닌 행을 계산하려고합니다. 그가 사용하고 싶은 것은 사실 wc이지만, 다음 을 사용 하여 스트림을 편집 한 후에 만sed
EhevuTov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.