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이 또한 같은 프로그램입니다 sloc및 cloc그 코드 라인 수를 할 여기가.
— 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.