web-dev-qa-db-ja.com

bashでコード行(非空白)を数える

Bashでは、プロジェクト内の非空白コード行の数をどのように数えますか?

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

そして、コメントの空白行を考慮する場合:

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

ただし、それは言語に依存します。

177
Michael Cramer
#!/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は、表示されているファイルの拡張子です。異なる拡張子を持つファイルは無視されます。

50
Gilles

シェルスクリプト以外のものを使用する場合は、 CLOC を試してください。

clocは、多くのプログラミング言語の空白行、コメント行、およびソースコードの物理行をカウントします。それは完全にPerlで書かれており、Perl v5.6以降の標準配布以外の依存関係はありません(一部の外部モジュールからのコードはclocに埋め込まれています)。

34
xsl

一般的なシェルユーティリティを使用して、これを行うには多くの方法があります。

私の解決策は次のとおりです。

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

これは、<file>内の行を検索します。パターンと一致しない(-v)行(-e) '^\s * $'は行の始まりで、その後に0個以上の空白文字が続きます。行末まで(つまり、空白以外のコンテンツがない)、一致する行自体ではなく、一致する行の数(-c)を表示します。

wcへのパイピングを含むメソッドに対するこのメソッドの利点は、複数のファイルを指定して、ファイルごとに個別のカウントを取得できることです。

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

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

'wc'は行、単語、文字をカウントするため、すべての行(空白を含む)をカウントするには次を使用します。

wc *.py

空白行を除外するには、grepを使用できます。

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

「-v」は、grepに一致する行を除くすべての行を出力するよう指示します。「^」は行の先頭です「\ s *」はゼロ個以上の空白文字「$」は行の末尾です* .pyは私の例ですカウントしたいすべてのファイル(現在のディレクトリ内のすべてのpythonファイル)はwcにパイプ出力します。どうぞ。

私は自分の(本物の)質問に答えています。これをカバーするstackoverflowエントリが見つかりませんでした。

13

このコマンドは、非空白行の数をカウントします。
cat fileName | grep -v ^$ | wc -l
grep -v ^ $正規表現関数は空白行を無視します。

9
coastline
cat 'filename' | grep '[^ ]' | wc -l

うまくやってください

5
curtisk
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ソースで機能しました(複数行コメントのすべての行で*を使用しています)。

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

プロジェクト内のコード行をカウントする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

my project の出力は次のようになります。

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

楽しい! -- カラン

2
curran

プロジェクト全体で特定のファイル拡張子のすべてのファイルのすべての非空白行の合計が必要な場合:

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

最初のargはプロジェクトのベースディレクトリ、2番目はファイル拡張子です。サンプル使用法:

./scriptname ~/Dropbox/project/src Java

これは、以前のソリューションのコレクションに過ぎません。

1
Andy

プロジェクトにあるファイルの数に依存します。理論的には使用できます

grep -c '.' <list of files>

検索ユーティリティを使用してファイルのリストを入力できる場所。

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

ファイルごとに行カウントを提供します。

1
Linor

現在のディレクトリ内の特定のファイル拡張子を持つすべての非空白行を再帰的にカウントするスクリプト:

#!/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
1
Keith Pinson
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt

現在のディレクトリとそのサブディレクトリ内のすべてのファイルの集計カウントを提供します。

HTH!

0
Dutch
rgrep . | wc -l

現在の作業ディレクトリ内の非空白行の数を示します。

0
jean-emmanuel

これにより、空白行をカウントせずに行数をカウントできます。

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