বাশ-এ-কোড গণনা (খালি নয়) lines


151

বাশ-এ, আমি কীভাবে কোনও প্রকল্পে কোডের নন-ফাঁকা লাইনের সংখ্যা গণনা করব?


1
নীচের অনেকগুলি সমাধান কেবল একটি ফাইলের জন্য কাজ করে (উদাঃ foo.c)। কোনও প্রকল্পের লাইনের টোল সংখ্যা সম্পর্কে কোনও চিন্তা (উদাহরণস্বরূপ ডিরেক্টরি কাঠামোর অনেকগুলি ফাইল এবং বাইনারি ফাইলগুলি বাদ দিয়ে)?
সলিউশনপলজিং

5
@ সলভিংপজলস আমি মনে করি আমি সেই অংশটির উত্তর দিতে পারি। যে কোনও সমাধানের জন্য একটি ফাইলের মধ্যে কাজ করা হয়, যেমন "বিড়াল ফাইল | সেড ব্লাহ", আপনি "ক্যাট ফাইল" কে একটি কমান্ড দিয়ে প্রতিস্থাপন করে অনেকগুলি ফাইলের উপর কাজ করতে পারেন যা ফাইলের নামগুলি পরিচালনা করে, যেমন "ফাইন্ড। -নাম '* .py '", এবং পাইপ যা" xargs বিড়াল "মধ্যে রয়েছে। উদাহরণস্বরূপ "সন্ধান করুন। -নম '* .পি' | এক্সগার্স বিড়াল | সেড '/ ^ \ s * $ / ডি' | ডাব্লুসি-এল"
জোনাথন হার্টলে

2
@ জোনাথান হার্টলি @ সলভিংপজলস এর মতো প্রোগ্রাম রয়েছে slocএবং clocসেই কোড লাইন গণনা করার জন্য এখানে রয়েছে।
AsTeR

ওপি এখানে: আমি যখন প্রথম এই সমস্যাটি জিজ্ঞাসা করেছি, পাইথন কোডে 'ক্লক' খুব ভাল কাজ করে নি। আজকাল এটি দুর্দান্ত।
জোনাথন হার্টলি 21

ক্লক একটি এনপিএম মডিউল হিসাবে উপলব্ধ এবং অনেক সময় সাশ্রয় করে।
কৃষ্ণ বেদুলা

উত্তর:


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

এবং যদি আপনি মন্তব্যগুলি ফাঁকা রেখা বিবেচনা করেন:

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

যদিও, এটি ভাষা নির্ভর।


24
আপনি কেন সেখানে বিড়াল ব্যবহার করছেন তা নিশ্চিত নন। শেডে যেতে ফাইলের নাম হিসাবে foo.c বা foo.pl ব্যবহার করুন। সেড '/ ^ \ s * $ / d' foo.c | wc -l
অ্যান্ডি লেস্টার

28
শুধু অভ্যাস। আমি বাম থেকে ডানে পাইপলাইন পড়ি যার অর্থ আমি সাধারণত বিড়াল দিয়ে শুরু করি, তারপরে ক্রিয়া, ক্রিয়া, ক্রিয়া ইত্যাদি স্পষ্টতই, শেষ ফলাফলটি একই।
মাইকেল ক্র্যামার

32
সমস্ত সাবফোল্ডারগুলিতে সমস্ত ফাইলের জন্য এটি করতে এবং '//' দিয়ে মন্তব্যগুলি বাদ দিতে, এই আদেশটি এতে প্রসারিত করুন: সন্ধান করুন। -type f -name '* .c' -Eecec বিড়াল {} \; | সেড '/ ^ \ এস * # / ডি; / ^ \ এস * $ / ডি; / ^ \ এস * \ / \ // ডি' | wc -l
বেনিয়ামিন ইন্টাল

11
আপনি UUOC ছাড়া বাম থেকে ডানে পড়তে পারেন: < foo.pl sed 'stuff' | wc -l
jw013

22
সাধারণভাবে বলতে গেলে, ইউইউসি গুরুত্বপূর্ণ নয়, তবে পঠনযোগ্যতা।
andersand

52
#!/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

উপরেরগুলি আপনাকে একটি প্রকল্পের জন্য কোডের লাইনগুলি (ফাঁকা লাইনগুলি সরানো) এর মোট গণনা দেবে (বর্তমান ফোল্ডার এবং পুনরাবৃত্তভাবে সমস্ত সাবফোল্ডার)।

উপরের "। .Php, .as, .sql, .css, .js হ'ল ফাইলগুলির এক্সটেনশন হচ্ছে। ভিন্ন এক্সটেনশান সহ যে কোনও ফাইল এড়ানো হবে।


1
একটি রেল অ্যাপ্লিকেশনটির জন্য প্রকরণ: সন্ধান করুন। -পথ '। '-প্রিন -ও-প্রিন্ট | উদাহরণস্বরূপ grep -v 'svn' | xargs বিড়াল | সেড '/ ^ \ এস * $ / ডি' |
ডাব্লুসি-

1
আপনাকে $গ্রেপ ( ...\.js$|...) এ একটি যুক্ত করতে হবে অন্যথায় এটি মেলে feature.js.swp
শিওনক্রস

আপনি অ্যাঙ্করিং ভুলে গেছেন, সুতরাং এতে ভুল ফাইল রয়েছে। এবং অ্যাঙ্করিং সহ একটি আরও সহজ সংস্করণ:find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
মার্ক জেরোনিমাস

36

আপনি যদি শেল স্ক্রিপ্ট ব্যতীত অন্য কিছু ব্যবহার করতে চান তবে CLOC চেষ্টা করুন :

ক্লক অনেক প্রোগ্রামিং ভাষায় ফাঁকা লাইন, মন্তব্য লাইন এবং উত্স কোডের শারীরিক লাইন গণনা করে। এটি পার্ল v5.6 এবং এর উচ্চতর স্ট্যান্ডার্ড বিতরণের বাইরে কোনও নির্ভরতা ছাড়াই পুরোপুরি লেখা হয়েছে (কিছু বাহ্যিক মডিউলগুলির কোডটি ক্লকের মধ্যে এমবেড করা আছে) এবং তাই এটি বেশ বহনযোগ্য।


2
আমি যখন প্রথম এই প্রশ্নটি জিজ্ঞাসা করেছি, তখন 'ক্লক' পাইথন ডকাস্ট্রিংকে কোডের লাইন হিসাবে গণ্য করেছিল, যা ছিল সাবমোটিমাল আইএমএইচও। 'ক্লক'-এর আধুনিক সংস্করণগুলি পাইথন ডকস্ট্রিংকে এখন মন্তব্য হিসাবে গণ্য করে, যা আমি আরও অনেক পছন্দ করি।
জোনাথন হার্টলি

এটা সঠিক উত্তর! আমি কেবল ক্লক আউট চেষ্টা করেছি এবং এটি কাজটি ভালভাবে করে।
লিমোবাইল

31

সাধারণ শেল ইউটিলিটিগুলি ব্যবহার করে এটি করার বিভিন্ন উপায় রয়েছে।

আমার সমাধানটি হ'ল:

grep -cve '^\s*$' <file>

এটি <file> দ্য মেলে না (-v) লাইনগুলিতে অনুসন্ধান করে যা (-e) '^ \ s * $' এর সাথে মেলে যা একটি লাইনের সূচনা, তারপরে 0 বা আরও শ্বেত স্পেস অক্ষর অনুসরণ করে একটি রেখার শেষে (অর্থাত্ সাদা বাক্সের কোনও সামগ্রী নেই), এবং নিজেরাই মিলে যাওয়া লাইনের পরিবর্তে ম্যাচিং লাইনগুলির একটি গণনা প্রদর্শন করুন (-সি)।

পাইপিং জড়িত পদ্ধতিগুলির মধ্যে এই পদ্ধতির একটি সুবিধা wcহ'ল আপনি একাধিক ফাইল নির্দিষ্ট করতে পারেন এবং প্রতিটি ফাইলের জন্য পৃথক গণনা পেতে পারেন:

$ grep -cve '^\s*$' *.hh

config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39

2
ধন্যবাদ! ঘটনাচক্রে, ডাব্লুসিটি প্রতিটি প্রদত্ত ফাইলের জন্য একটি সংখ্যা সরবরাহ করে, মোট মোট plus
জোনাথন হার্টলি

1
আপনি এটিতে পাইপ দিচ্ছেন না তবে, কেবলমাত্র একটি ফাইল হিসাবে গণনা করা।
চামচমিজার

এটি আমার মতে সেরা উত্তর।
সিংহমাইলিকো

-eপ্রয়োজন হয় না. এটি প্যাটার্নের সাধারণ অবস্থানগত অবস্থান এবং আপনি এটির সাথে মজার কিছু করছেন না। তবে আপনার স্টাইলটি যদি স্পষ্টভাবে বোঝায় তবে কিছুই ভুল হবে না।
জ্যাকটোজ

13

'ডাব্লুসি' রেখা, শব্দ, অক্ষর গণনা করে তাই সমস্ত লাইন গণনা করতে (ফাঁকাগুলি সহ) ব্যবহার করুন:

wc *.py

ফাঁকা লাইনগুলি ফিল্টার করার জন্য, আপনি গ্রেপ ব্যবহার করতে পারেন:

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

'-v' গ্রেপকে সমস্ত লাইন আউটপুট করতে বলে যে '^' এর সাথে মেলে এমন একটি রেখার শুরু '\ s *' শূন্য বা আরও শ্বেত স্পেসের অক্ষর '$' একটি লাইনের শেষে * .পি আমার উদাহরণ আপনি গণনা করতে চান এমন সমস্ত ফাইল (বর্তমান দির সমস্ত পাইথন ফাইল) পাইপ আউটপুট ডাব্লু। আপনি চলে যান।

আমি আমার নিজের (জেনুইন) প্রশ্নের উত্তর দিচ্ছি। এটিতে আবৃত স্ট্যাকওভারফ্লো এন্ট্রিটি খুঁজে পেল না।


5
\ ডাবল সাদা স্থানের জন্য কোনও মিল নয়, এটি শব্দহীন অক্ষরের সাথে মেলে। এটি \ ডাব্লু, শব্দের অক্ষরের বিপরীত। \ ডাব্লু এমন কোনও কিছুর সাথে মিলবে যা বর্ণানুক্রমিক বা আন্ডারস্কোর নয় এবং তাই এখানে আপনি যা দাবি করেন তা করেন না। আপনার অর্থ
স্পুনমাইজার

9

এই কমান্ডটি নন-ফাঁকা লাইনের সংখ্যা গণনা করে।
cat fileName | grep -v ^$ | wc -l
grep -v ^ $ নিয়মিত এক্সপ্রেশন ফাংশন ফাঁকা রেখা উপেক্ষা করে।


এই উত্তরটি সর্বাধিক
সোজাসাপ্টা

2
catএই চেইনে কোনও প্রয়োজন নেই :grep -v ^$ fileName | wl -l
অ্যাথালাইডস

7
wc -lগ্রিপ রয়েছে বলেও দরকার নেই -c:grep -vc ^$ fileName
জ্যাকটোজ


5
cat 'filename' | grep '[^ ]' | wc -l

কৌশলটি ঠিক করা উচিত


3
কেন আপনি বিড়াল এবং পাইপ ফাইলটিকে গ্রেপ হিসাবে ব্যবহার করুন, যখন আপনি ফাইলের নামটি প্রথম স্থানে গ্রেপ করার পক্ষে যুক্তি হিসাবে পাস করতে পারেন?
চামচমাইজার

সত্য, এটি আমার চারপাশে কেবলমাত্র একটি পুরানো উপন্যাস ... এটি বিপরীতমুখী ব্যবহারের পরিবর্তে মূলত আপনার সমাধানের মতোই হয়
কার্টিস্ক

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

1
আমি এটিকে ভোট দিয়েছি কারণ আমি আক্ষরিক অর্থেই কাউকে কখনও কোনও অজানা স্ক্রিপ্টে প্রিনক্রেনমেন্ট ব্যবহার করতে দেখিনি, তবে দুর্ভাগ্যক্রমে এটি কেবল ফাঁকা রেখা গণনা করে। :) আপনি বলতে চাচ্ছেন awk '!/^[[:space:]]*$/{++x} END{print x}'। বা, যদি আপনি সত্যিই negative awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
ণাত্মক

4
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

আমি এই পোস্টটি পোস্ট করেছি অন্য বিকল্পগুলি আমার পক্ষে ভুল উত্তর দিয়েছে। এটি আমার জাভা উত্সের সাথে কাজ করেছে, যেখানে মন্তব্য লাইনগুলি / অথবা * দিয়ে শুরু হয় (আমি বহু লাইনের মন্তব্যে প্রতিটি লাইনে * ব্যবহার করি)।


এটি একটি কার্যক্ষম সমাধান। কেবল লক্ষ্য করার মতো বিষয়: এটি বহু লাইন মন্তব্য গণনা করে না
আমল

2

এখানে একটি বাশ স্ক্রিপ্ট যা কোনও প্রকল্পের কোডের লাইন গণনা করে। এটি উত্স গাছকে পুনরাবৃত্তভাবে অনুসরণ করে এবং এটি ফাঁকা লাইন এবং একক লাইনের মন্তব্যগুলিকে বাদ দেয় যা "//" ব্যবহার করে।

# $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

উপভোগ করুন! - কুরান


1

এটি আপনার প্রকল্পে থাকা ফাইলগুলির সংখ্যার উপর নির্ভর করবে kind তত্ত্ব আপনি ব্যবহার করতে পারে

grep -c '.' <list of files>

যেখানে আপনি সন্ধানের ইউটিলিটিটি ব্যবহার করে ফাইলগুলির তালিকা পূরণ করতে পারেন।

grep -c '.' `find -type f`

আপনাকে প্রতি ফাইলটিতে একটি লাইন গণনা দেবে।


1
। হোয়াইটস্পেসের সাথে মেলে। এই সমাধানটি কেবলমাত্র তখনই কাজ করে যদি আপনি কেবল শ্বেতস্থানযুক্ত একটি লাইনকে শূন্যস্থান হিসাবে বিবেচনা করেন যা এটি প্রযুক্তিগতভাবে রয়েছে, যদিও এটি সম্ভবত আপনি পরে যা করছেন না।
চামচমাইজার

1

বর্তমান ডিরেক্টরিতে নির্দিষ্ট ফাইল এক্সটেনশন সহ সমস্ত খালি ফাঁকা লাইনগুলি পুনরাবৃত্তভাবে গণনা করার স্ক্রিপ্ট:

#!/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

ধন্যবাদ রেসিপিটির "নন-ফাঁকা" অংশের জন্য @ অ্যান্ডি লেস্টারকে (আপনার মন্তব্যে +1) যান।
কিথ পিনসন

মূলত (কিছুটা আরও ভার্বোস) "নন-ফাঁকা" সমাধান পোস্ট করার জন্য @ মিশেল ক্র্যামারকে (আপনার পোস্টে +1) ধন্যবাদ জানাই।
কিথ পিনসন

1

আপনি যদি কোনও প্রকল্প জুড়ে প্রদত্ত ফাইল এক্সটেনশনের সমস্ত ফাইলের জন্য সমস্ত নন-ফাঁকা লাইনের যোগফল চান:

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

এটি পূর্ববর্তী সমাধানগুলির সংগ্রহের চেয়ে কিছুটা বেশি।


এই ফাইলটি প্রতিটি ফাইলে প্রতি লাইন একবার গ্রিপ চালু করে বৃহত্তম সংখ্যক কাঁটাচামক + এক্সিকিউটিভ কলগুলির জন্য পুরষ্কার পায়। ;)
ড্যানিসাউয়ার

0
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt

বর্তমান ডিরেক্টরি এবং এর উপ-ডিরেক্টরিতে সমস্ত ফাইলের জন্য একটি সামগ্রিক গণনা দেয়।

আছে HTH!


\ ডব্লিউ শব্দহীন অক্ষর; ${-[*]} + $@উদাহরণস্বরূপ এটি কোনও লাইনের সাথে মেলে না । যা অবশ্যই বিশ্বের কোথাও বৈধ কোড। ;) আপনার অর্থ স্থানের। গুলি।
dannysauer

0

এটি ফাঁকা রেখা গণনা ছাড়াই লাইনের সংখ্যা গণনা দেয়:

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


-3

ইতিমধ্যে লিনাক্সের জন্য 'ডাব্লুসি' নামে একটি প্রোগ্রাম রয়েছে।

মাত্র

wc -l *.c 

এবং এটি আপনাকে প্রতিটি ফাইলের জন্য মোট লাইন এবং লাইন দেয়।


3
আরে। 'ডাব্লুসি' নিজেই সাবডিয়ারদের অনুসন্ধান করে না এবং এটি ফাঁকা লাইনগুলি ফিল্টার করে না, উভয়ই প্রশ্নে স্পষ্টভাবে জিজ্ঞাসা করেছিল।
জোনাথন হার্টলি

wcফাঁকা রেখা গণনা করে। ওপি খালি ফাঁকা লাইন গণনা করতে চায়। এটি সত্য যে তিনি ব্যবহার করতে চাইবেন wcতবে এটি ব্যবহার করে স্ট্রিমটি সম্পাদিত হওয়ার পরেইsed
এহেভটোভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.