En Bash, ¿cómo puedo contar el número de líneas de código no en blanco en un proyecto?recuento (no en blanco) líneas de código en bash
Respuesta
cat foo.c | sed '/^\s*$/d' | wc -l
Y si se tiene en cuenta las líneas de comentarios en blanco:
cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
Aunque, eso es depende del idioma.
No estoy seguro de por qué estás usando gato allí . Use foo.c o foo.pl como nombre de archivo para pasar a sed. sed '/^\ s * $/d' foo.c | wc -l –
Solo hábito. Leo los conductos de izquierda a derecha, lo que significa que generalmente empiezo con cat, luego acción, acción, acción, etc. Claramente, el resultado final es el mismo. –
Para hacer esto para todos los archivos en todas las subcarpetas y para excluir comentarios con '//', amplíe este comando a esto: find. -type f -name '* .c' -exec cat {} \; | sed '/^\ s * #/d;/^ \ s * $/d;/^ \ s * \/\ // d' | wc -l –
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
Votaría esto simplemente porque, literalmente, nunca he visto a nadie usar preincremento en un script de awk, pero desafortunadamente esto solo cuenta las líneas en blanco. :) Quieres decir 'awk '!/^ [[: Espacio:]] * $/{++ x} END {imprimir x}' '. O bien, si realmente odias los negativos, 'awk' {y ++}/^ [[: espacio:]] * $/{++ x} END {imprimir yx} '';) – dannysauer
w _ cuenta líneas, palabras, caracteres, de modo de contar todas las líneas (incluyendo los en blanco) usan:
wc *.py
para filtrar las líneas en blanco, se puede utilizar grep:
grep -v '^\s*$' *.py | wc
'-v' le dice a grep para dar salida a todas las líneas excepto los que coinciden '^' es el comienzo de una línea '\ s *' es cero o más espacios en blanco '$' es el final de una línea * .py es mi ejemplo para todo el archivo s desea contar (todos los archivos python en el directorio actual) salida de tubería a wc. Listo.
Estoy respondiendo mi propia (genuina) pregunta. No se pudo encontrar una entrada de stackoverflow que cubriera esto.
\ W no coincide con espacios en blanco, coincide con caracteres que no son palabras. Es lo contrario de \ w, caracteres de palabras. \ W Coincidirá con cualquier cosa que no sea alfanumérica o de subrayado y, por lo tanto, no hará lo que dice que hace aquí. Quiere decir \ s – SpoonMeiser
Si desea utilizar algo más que un script de shell, trate CLOC:
recuentos cloc líneas en blanco, comentar líneas y líneas físicas de código fuente en muchos lenguajes de programación. Se está escrito completamente en Perl sin dependencias fuera de la distribución estándar de de Perl v5.6 y superior (código de algunos módulos externos es incrustado dentro cloc) y así es bastante portátil.
cuando Primero pregunté esta pregunta, 'cloc' contó las cadenas de Python como líneas de código, lo cual no era óptimo en mi humilde opinión.Las versiones modernas de 'cloc' ahora cuentan las cadenas de Python como comentarios, que me gustan mucho más. –
Hay muchas maneras de hacerlo, utilizando utilidades de shell comunes.
Mi solución es:
grep -cve '^\s*$' <file>
Esta expresión busca líneas en <archivo> la no coinciden (-v) líneas que coinciden con el patrón (-e) '^ \ s * $', que es el comienzo de una línea, seguido de 0 o más caracteres en blanco, seguido del final de una línea (es decir, sin contenido distinto del espacio en blanco), y muestra un recuento de líneas coincidentes (-c) en lugar de las líneas correspondientes.
Una ventaja de este método sobre los métodos que implican la tubería en el wc
, es que se pueden especificar varios archivos y obtener una cuenta separada para cada archivo:
$ grep -cve '^\s*$' *.hh
config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39
¡Gracias! Por cierto, wc proporciona un conteo por cada archivo dado, más un total. –
No, si está conectado, como estándar en los recuentos como un solo archivo. – SpoonMeiser
cat 'filename' | grep '[^ ]' | wc -l
debe hacer el truco muy bien
¿Por qué utilizar cat y pipe el archivo en grep, cuando en primer lugar se puede pasar el nombre del archivo como argumento para grep? – SpoonMeiser
cierto, es solo un viejo alias que tengo alrededor ... básicamente hace lo mismo que su solución en lugar de usar el inverso – curtisk
Depende de la cantidad de archivos que tenga en el proyecto.En teoría, puede usar
grep -c '.' <list of files>
Donde puede completar la lista de archivos utilizando la utilidad de búsqueda.
grep -c '.' `find -type f`
Le daría un recuento de líneas por archivo.
. coincide con el espacio en blanco. Esta solución solo funciona si considera que una línea que contiene solo espacios en blanco no está en blanco, que técnicamente es, aunque probablemente no sea lo que está buscando. – SpoonMeiser
#!/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
Lo anterior le dará el número total de líneas de código (líneas en blanco eliminados) para un proyecto (carpeta actual y todas las subcarpetas de forma recursiva).
En el anterior "./blog" "./punbb" "./js/3rdparty" y "./pma" son carpetas que incluyo en la lista negra porque no escribí el código en ellas. También .php, .as, .sql, .css, .js son las extensiones de los archivos que se están mirando. Cualquier archivo con una extensión diferente es ignorado.
variación para una aplicación de Rails: buscar. -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 cat | sed '/^\ s * $/d' | wc -l – poseid
Necesita agregar un '$' al grep ('... \. js $ | ...') de lo contrario coincidirá con 'feature.js.swp'. – Xeoncross
Olvidó el anclaje, por lo que incluye archivos incorrectos. Y una versión aún más simple con anclaje: 'encontrar. | egrep '. \. c $ |. \. h $' | xargs cat | sed '/^\ s * $/d' | wc -l' –
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
da un conteo agregado para todos los archivos en el directorio actual y sus subdirectorios.
HTH!
\ W es caracteres no word; esto no coincidirá con una línea como '$ {- [*]} + $ @', por ejemplo. Que es seguramente un código válido en algún lugar del mundo. ;) Te refieres al espacio. – dannysauer
Esto le da al recuento del número de líneas sin contar las líneas en blanco:
grep -v ^$ filename wc -l | sed -e 's/ //g'
escritura para contar de forma recursiva todas las líneas no están en blanco con una determinada extensión de archivo en el directorio actual:
#!/usr/bin/env bash
(
echo 0;
for ext in "[email protected]"; 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;
el uso de la muestra:
./countlines.sh .py .java .html
Gracias a @Andy Lester (+1 en su comentario) por la parte "no en blanco" de la receta. –
Gracias también a @Michael Cramer (+1 en su publicación) por publicar originalmente la solución "no en blanco" (un poco más detallada). –
Si desea que la suma de todas las líneas no están en blanco para todos los archivos o f una extensión de archivo dada a lo largo de un proyecto:
while read line
do grep -cve '^\s*$' "$line"
done < <(find $1 -name "*.$2" -print) | awk '{s+=$1} END {print s}'
Primero arg es el directorio base del proyecto, el segundo es la extensión del archivo. Uso de la muestra:
./scriptname ~/Dropbox/project/src java
Es poco más que una colección de soluciones anteriores.
Éste recibe el premio por la mayor cantidad de llamadas fork + exec al lanzar grep una vez por línea en cada archivo. ;) – dannysauer
Ya hay un programa para esto en Linux llamado 'wc'.
Sólo
wc -l *.c
y le da el total de líneas y las líneas para cada archivo.
Oye. 'wc' por sí mismo no busca subdirectorios, y no filtra las líneas en blanco, ambas explícitamente solicitadas en la pregunta. –
'wc' cuenta líneas en blanco. El OP quiere contar líneas no en blanco. Es cierto que querrá usar 'wc', pero solo después de haber sido editado usando' sed' – EhevuTov
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
publico esto porque otras opciones me dieron respuestas incorrectas. Esto funcionó con mi fuente de Java, donde las líneas de comentarios comienzan con/o * (uso * en cada línea en el comentario de varias líneas).
Aquí hay un script Bash que cuenta las líneas de código en un proyecto. Atraviesa un árbol fuente recursivamente y excluye las líneas en blanco y los comentarios de una sola línea que usan "//".
# $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
Esto es lo que la salida se parece a 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
disfrutar! - Curran
Este comando cuenta el número de líneas no en blanco en nuestro proyecto. cat fileName | grep -v ^$ | wc -l
grep -v^$ función de expresión regular es ignorar líneas en blanco.
rgrep . | wc -l
indica el recuento de las líneas que no están en blanco en el directorio de trabajo actual.
- 1. Número de líneas de código de recuento en Visual Studio
- 2. Concatenar líneas en Bash
- 3. recuento de líneas en un proyecto PHP
- 4. AWK eliminar líneas en blanco
- 5. Concatenación de espacio en blanco en Bash
- 6. Obtener el recuento de líneas de todos los archivos del proyecto en orden ordenado. (Terminal Bash)
- 7. eliminar líneas en blanco adicionales en emacs
- 8. ¿Cómo insertar líneas en blanco en PDF?
- 9. Reemplace las líneas nuevas, pero conserve las líneas en blanco
- 10. Eliminar líneas en blanco con grep
- 11. BASH alias en blanco para 'cd'
- 12. Líneas de continuación de Bash
- 13. asignación de múltiples líneas en bash
- 14. Mostrar espacios en blanco en emacs sólo en líneas
- 15. ¿Cómo ordenar con múltiples líneas en bash?
- 16. Líneas en blanco en la lista en Redmine
- 17. Bucle en directorios con espacios en blanco en Bash
- 18. Cómo limpiar una base de código, espacios en blanco, nuevas líneas, etc
- 19. ¿Cómo tener líneas en blanco en un documento .text.haml?
- 20. Utilidad para contar el número de líneas de código en Python o Bash
- 21. Contar el número de líneas en un archivo txt con Python excluyendo las líneas en blanco
- 22. ¿Cómo identificar y eliminar líneas nuevas y espacios en blanco?
- 23. bash loop skip líneas comentadas
- 24. Extracción espacios en blanco finales sólo para líneas editadas
- 25. cortando una cadena en varias líneas en bash
- 26. Visual Studio - Determinación de líneas No de líneas de código en un proyecto
- 27. Mostrar recuento de trabajos en bash mensaje sólo si no es cero
- 28. Manera simple de colorear líneas de salida alternativas en bash
- 29. ¿Cómo transformar líneas múltiples en una línea en bash stdout?
- 30. Líneas de código en Eclipse PyDev Projects
Muchas de las siguientes soluciones solo funcionan para un archivo (por ejemplo, 'foo.c'). ¿Alguna idea sobre el número total de líneas en un proyecto (por ejemplo, muchos archivos en la estructura del directorio y excluyendo archivos binarios)? – solvingPuzzles
@solvingPuzzles Creo que puedo responder esa parte. Para cualquier solución que funcione en un archivo, p. "cat FILE | sed blah", puede trabajar en muchos archivos reemplazando el "cat FILE" con un comando que enumera los nombres de archivo para operar, p. "find. -name '\ *. py'", y canaliza eso en "xargs cat". p.ej. "find. -name '* .py' | xargs cat | sed '/^\ s * $/d' | wc -l" –
@JonathanHartley @solvingPuzzles También hay programas como 'sloc' y' cloc' que están aquí hacer esos recuentos de líneas de código. – AsTeR