Як в Bash я рахую кількість непорожніх рядків коду в проекті?
sloc
і cloc
тут, щоб зробити ці підрахунки рядків коду.
Як в Bash я рахую кількість непорожніх рядків коду в проекті?
sloc
і cloc
тут, щоб зробити ці підрахунки рядків коду.
Відповіді:
cat foo.c | sed '/^\s*$/d' | wc -l
І якщо ви вважаєте коментарі порожніми рядками:
cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
Хоча, це залежить від мови.
< foo.pl sed 'stuff' | 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 - це розширення файлів, які переглядаються. Будь-які файли з іншим розширенням ігноруються.
$
до grep ( ...\.js$|...
), інакше він збігатиметься feature.js.swp
.
find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Якщо ви хочете використовувати щось інше, ніж скрипт оболонки, спробуйте CLOC :
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
-e
не потрібно. Це нормальне місце розташування шаблону, і ви нічого з цим не робите. Але нічого поганого в тому, щоб бути явним, якщо це ваш стиль.
'wc' рахує рядки, слова, символи, тому для підрахунку всіх рядків (включаючи порожні) використовується:
wc *.py
Щоб відфільтрувати порожні рядки, ви можете використовувати grep:
grep -v '^\s*$' *.py | wc
'-v' повідомляє grep виводити всі рядки, за винятком тих, що відповідають '^' - це початок рядка '\ s *' - нуль або більше символів пробілу '$' - це кінець рядка * .py - мій приклад для всі файли, які ви хочете порахувати (усі файли python у поточному режимі), виводять трубу на wc. Іди.
Я відповідаю на власне (справжнє) запитання. Не вдалося знайти запис stackoverflow, який охоплював це.
Ця команда рахує кількість порожніх рядків. cat fileName | grep -v ^$ | wc -l
Функція регулярного вираження grep -v ^ $ - ігнорування порожніх рядків.
cat
цьому ланцюжку немає необхідності :grep -v ^$ fileName | wl -l
wc -l
тому, що -c
grep -vc ^$ fileName
cat 'filename' | grep '[^ ]' | wc -l
повинен зробити трюк просто чудово
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
awk '!/^[[:space:]]*$/{++x} END{print x}'
. Або, якщо ви справді ненавидите негативи awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
,;)
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 -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
дає сукупний підрахунок для всіх файлів у поточному каталозі та його підкаталогах.
HTH!
${-[*]} + $@
, наприклад. Який, безумовно, дійсний код десь у світі. ;) Ви маєте на увазі \ s для простору.
rgrep . | wc -l
дає кількість непорожніх рядків у поточному робочому каталозі.
Для цього вже існує програма для Linux, яка називається "wc".
Просто
wc -l *.c
і він дає вам загальні рядки та рядки для кожного файлу.
wc
рахує порожні рядки. ОП хоче рахувати непорожні рядки. Це правда, що він захоче користуватися wc
, але лише після редагування потоку з використаннямsed
foo.c
). Будь-які думки щодо загальної кількості рядків у проекті (наприклад, багато файлів у структурі каталогів та виключення бінарних файлів)?