zählen (nicht leer) Zeilen-of-Code in bash
Frage
In Bash, wie zähle ich die Anzahl der nicht leeren Zeilen Code in einem Projekt?
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
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.