Как в Bash подсчитать количество непустых строк кода в проекте?
количество (непустых) строк кода в bash
Ответы (19)
cat foo.c | sed '/^\s*$/d' | wc -l
А если считать комментарии пустыми строками:
cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
Хотя, это зависит от языка.
< foo.pl sed 'stuff' | wc -l
.
- person jw013; 05.12.2011
grep -c '^$' $YOURFILE
из здесь а>.
- person divinedragon; 11.09.2014
cat file | wc -l
. Я заметил, что вопрос ищет непустые строки; тем не менее, для справки было бы неплохо, так как это первый результат Google для строк подсчета bash (по крайней мере, для меня это было).
- person Qw3ry; 18.08.2017
-v
: grep -vc '^$' $YOURFILE
. Чтобы включить только пробельные строки как пустые, см. Ответ SpoonMeiser.
- person Jacktose; 13.03.2019
for f in *.sh; do lines=$(sed '/^\s*#/d;/^\s*$/d' $f | wc -l); echo ${f} : ${lines}; done
- person Mirza Prangon; 31.03.2021
#!/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 являются расширениями просматриваемых файлов. Любые файлы с другим расширением игнорируются.
$
к grep (...\.js$|...
), иначе он будет соответствовать feature.js.swp
.
- person Xeoncross; 13.03.2015
find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
- person Mark Jeronimus; 14.12.2017
Если вы хотите использовать что-то другое, кроме сценария оболочки, попробуйте CLOC:
cloc подсчитывает пустые строки, строки комментариев и физические строки исходного кода на многих языках программирования. Он полностью написан на Perl без каких-либо зависимостей за пределами стандартного дистрибутива Perl версии 5.6 и выше (код некоторых внешних модулей встроен в cloc) и поэтому вполне переносим.
Есть много способов сделать это, используя общие утилиты оболочки.
Мое решение:
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
-e
не нужно. Это нормальное позиционное расположение паттерна, и вы не делаете с ним ничего странного. Но нет ничего плохого в том, чтобы быть откровенным, если это ваш стиль.
- person Jacktose; 13.03.2019
Эта команда подсчитывает количество непустых строк. cat fileName | grep -v ^$ | wc -l
grep -v ^$ Функция регулярного выражения игнорирует пустые строки.
cat
: grep -v ^$ fileName | wl -l
- person Aethalides; 09.08.2018
wc -l
, потому что у grep есть -c
: grep -vc ^$ fileName
- person Jacktose; 13.03.2019
'wc' считает строки, слова, символы, поэтому для подсчета всех строк (включая пустые) используйте:
wc *.py
Чтобы отфильтровать пустые строки, вы можете использовать grep:
grep -v '^\s*$' *.py | wc
'-v' указывает grep вывести все строки, кроме тех, которые соответствуют '^' — начало строки '\s*' — ноль или более пробельных символов '$' — конец строки *.py — мой пример для все файлы, которые вы хотите подсчитать (все файлы python в текущем каталоге), выводятся в wc. Прочь.
Я отвечаю на свой собственный (подлинный) вопрос. Не удалось найти запись stackoverflow, описывающую это.
cat 'filename' | grep '[^ ]' | wc -l
должен сделать трюк просто отлично
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, где строки комментариев начинаются с / или * (я использую * в каждой строке многострочного комментария).
Вот сценарий 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
Наслаждаться! --Курран
Самая аккуратная команда
grep -vc ^$ fileName
с опцией -c
вам даже не нужно wc -l
Это будет зависеть от количества файлов, которые у вас есть в проекте. Теоретически вы могли бы использовать
grep -c '.' <list of files>
Где вы можете заполнить список файлов с помощью утилиты find.
grep -c '.' `find -type f`
Даст вам количество строк в файле.
Скрипт для рекурсивного подсчета всех непустых строк с определенным расширением файла в текущем каталоге:
#!/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
Если вам нужна сумма всех непустых строк для всех файлов с заданным расширением файла в проекте:
while read line
do grep -cve '^\s*$' "$line"
done < <(find $1 -name "*.$2" -print) | awk '{s+=$1} END {print s}'
Первый аргумент — это базовый каталог проекта, второй — расширение файла. Пример использования:
./scriptname ~/Dropbox/project/src java
Это не более чем набор предыдущих решений.
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
дает общее количество для всех файлов в текущем каталоге и его подкаталогах.
ХТХ!
${-[*]} + $@
. Что, безусловно, является действительным кодом где-то в мире. ;) Вы имеете в виду \s для пробела.
- person dannysauer; 30.08.2013
Это дает количество строк без учета пустых строк:
grep -v ^$ filename wc -l | sed -e 's/ //g'
rgrep . | wc -l
дает количество непустых строк в текущем рабочем каталоге.
В Linux уже есть программа для этого под названием «wc».
Просто
wc -l *.c
и он дает вам общее количество строк и строк для каждого файла.
wc
считает пустые строки. ОП хочет подсчитать непустые строки. Это правда, что он захочет использовать wc
, но только после того, как он будет отредактирован с помощью sed
.
- person EhevuTov; 21.09.2012
awk '!/^[[:space:]]*$/{++x} END{print x}'
. Или, если вы действительно ненавидите негативы, awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
;)
- person dannysauer; 30.08.2013
foo.c
). Любые мысли о общем количестве строк в проекте (например, много файлов в структуре каталогов и исключая двоичные файлы)? - person solvingPuzzles   schedule 15.09.2012sloc
иcloc
, которые здесь для подсчета строк кода. - person AsTeR   schedule 17.02.2015