Frage

In Bash, wie zähle ich die Anzahl der nicht leeren Zeilen Code in einem Projekt?

War es hilfreich?

Lösung

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

Und wenn man bedenkt, Kommentare Leerzeilen:

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

Obwohl, das ist sprachabhängig.

Andere Tipps

#!/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

Das oben werden Sie die Gesamtanzahl der Zeilen Code (Leerzeilen entfernt) für ein Projekt (aktuelle Ordner und alle Unterordner rekursiv).

In der obigen „./blog“ „./punbb“ „./js/3rdparty“ und „./pma“ sind Ordner ich die schwarze Liste, da ich nicht den Code in ihnen geschrieben hat. Auch .php, .as, .sql, CSS-, JS- sind die Erweiterungen der Dateien sah zu werden. Alle Dateien mit einer anderen Erweiterung, werden ignoriert.

Wenn Sie etwas anderes als ein Shell-Skript verwenden möchten, versuchen Sie CLOC :

  

cloc zählt Leerzeilen, Kommentar   Linien und physikalische Leitungen von Quellen   Code in vielen Programmiersprachen. Es   vollständig in Perl ist mit nicht geschrieben   Abhängigkeiten außerhalb der Norm   Verteilung von Perl v5.6 und höher   (Code von einigen externen Modulen   ganz eingebettet in cloc) und so ist   tragbar.

Es gibt viele Möglichkeiten, dies zu tun, mit gemeinsamem Shell-Utilities.

Meine Lösung ist:

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

Dies sucht nach Zeilen in die nicht übereinstimmen (-v) Linien, die das Muster (-e) übereinstimmen ‚^ \ s * $‘, die der Anfang einer Zeile, gefolgt von 0 oder mehr Leerzeichen Zeichen, die von dem Ende einer Zeile folgen (dh. keinen Inhalt andere dann Leerzeichen), und zeigen eine Anzahl von Anpassungsleitungen (-c) anstelle der passenden Leitungen selbst.

Ein Vorteil dieses Verfahren gegenüber Verfahren, die Rohrleitungen in wc beinhaltet, ist, dass Sie mehrere Dateien und erhalten eine separate Zählung für jede Datei angeben:

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

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

'wc' zählt Zeilen, Wörter, Zeichen, so alle Zeilen zählen (einschließlich Leer sind) verwenden:

wc *.py

Um die leeren Zeilen herauszufiltern, können Sie grep verwenden:

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

‚- v‘ sagt grep die Ausgabe alle Zeilen mit Ausnahme derjenigen, die passen ‚^‘ Ist der Anfang einer Zeile ‚\ S *‘ null oder mehr Leerzeichen ‚$‘ Ist das Ende einer Zeile * Py ist mein Beispiel für alle Dateien, die Sie wünschen (alle Python-Dateien im aktuellen Verzeichnis) zu zählen, Rohrausgang zu WC. Ab geht.

Ich bin meine eigene (echte) Frage zu beantworten. Es kann keinen Eintrag Stackoverflow finden, die diese abgedeckt.

Mit diesem Befehl gezählte Anzahl von Nicht-Leerzeilen.
cat fileName | grep -v ^$ | wc -l
grep -v ^ $ reguläre Ausdruck Funktion Leerzeilen ist ignorieren.

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

sollte es tun gerade fein

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

Ich poste diese becaus andere Optionen für mich falsche Antworten gab. Das funktionierte mit meiner Java-Quelle, wo Kommentarzeilen beginnen mit / oder * (i verwenden * auf jeder Zeile in mehrzeiligen Kommentar).

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

Hier ist ein Bash-Skript, das die Codezeilen in einem Projekt zählt. Es durchläuft einen Quellbaum rekursiv, und es schließt Leerzeilen und einzeilige Kommentare, die „//".

# $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

Hier ist, was die Ausgabe wie folgt aussieht für mein Projekt :

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

Viel Spaß! - Curran

Es wird ein bisschen von der Anzahl der Dateien ab, die Sie im Projekt haben. Theoretisch könnten Sie

grep -c '.' <list of files>

Wenn Sie die Liste der Dateien mithilfe des Such-Utility füllen können.

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

Würde geben Sie eine Zeilenanzahl pro Datei.

Script, um rekursiv alle Nicht-Leerzeilen mit einer bestimmten Dateierweiterung im aktuellen Verzeichnis zählen:

#!/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;

Verwendungsbeispiel:

./countlines.sh .py .java .html

Wenn Sie die Summe aller nicht-leeren Zeilen für alle Dateien eines bestimmten Dateierweiterung während eines Projekts:

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

Zuerst arg ist das Basisverzeichnis des Projekts, die zweite ist die Dateierweiterung. Verwendungsbeispiel:

./scriptname ~/Dropbox/project/src java

Es ist wenig mehr als eine Sammlung von bisherigen Lösungen.

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

gibt eine Gesamtzahl für alle Dateien im aktuellen Verzeichnis und dessen Unterverzeichnissen.

HTH!

Dies gibt die Anzahl der Anzahl der Zeilen, ohne die leeren Zeilen zu zählen:

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

gibt die Anzahl der nicht leeren Zeilen in dem aktuellen Arbeitsverzeichnis.

Es gibt bereits ein Programm für den auf Linux namens 'wc'.

Just

wc -l *.c 

und es gibt Ihnen die gesamten Leitungen und die Leitungen für jede Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top