Вопрос

Как в Bash подсчитать количество непустых строк кода в проекте?

Это было полезно?

Решение

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

А если учесть комментарии пустыми строками:

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

Хотя это зависит от языка.

Другие советы

#!/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 являются расширениями просматриваемых файлов.Любые файлы с другим расширением игнорируются.

Если вы хотите использовать что-то кроме сценария оболочки, попробуйте КЛОК:

CLOC считает пустые строки, строки комментариев и физические строки исходного кода во многих языках программирования.Он написан полностью в Perl без зависимостей за пределами стандартного распределения Perl V5.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

'wc' подсчитывает строки, слова, символы, поэтому для подсчета всех строк (включая пустые) используйте:

wc *.py

Чтобы отфильтровать пустые строки, вы можете использовать grep:

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

'-v' говорит grep для вывода всех строк, кроме тех, которые соответствуют '^', является началом строки ' s *'-это нулевое или более маточное символы '$'-это конец строки *.py-мой пример для Все файлы, которые вы хотите подсчитать (все файлы Python в текущем режиме)Идите.

Я отвечаю на свой (искренний) вопрос.Не удалось найти запись stackoverflow, посвященную этому.

Эта команда подсчитывает количество непустых строк.
cat fileName | grep -v ^$ | wc -l
Функция регулярного выражения grep -v ^$ игнорирует пустые строки.

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, где строки комментариев начинаются с / или * (я использую * в каждой строке многострочного комментария).

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

Вот скрипт 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 -c '.' <list of files>

Где можно заполнить список файлов с помощью утилиты поиска.

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

дает совокупное количество всех файлов в текущем каталоге и его подкаталогах.

ХТХ!

Это дает подсчет количества строк без учета пустых строк:

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

дает количество непустых строк в текущем рабочем каталоге.

Для этого в Linux уже есть программа под названием «wc».

Только

wc -l *.c 

и он дает вам общее количество строк и строк для каждого файла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top