ใน 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
UUOC:
#!/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 เป็นตัวอย่างของฉันสำหรับ ไฟล์ทั้งหมดที่คุณต้องการนับ (ไฟล์ไพ ธ อนทั้งหมดใน dir ปัจจุบัน) ไปป์ที่เอาต์พุต ไปเลย
ฉันกำลังตอบคำถาม (ของแท้) ของตัวเอง ไม่พบรายการ stackoverflow ที่ครอบคลุมสิ่งนี้
คำสั่งนี้นับจำนวนบรรทัดที่ไม่ว่าง cat fileName | grep -v ^$ | wc -l
grep -v ^ $ ฟังก์ชั่นการแสดงออกปกติละเว้นบรรทัดว่าง
cat
ในห่วงโซ่นี้:grep -v ^$ fileName | wl -l
wc -l
เพราะ grep มี-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}'
ARG แรกคือไดเรกทอรีฐานของโครงการที่สองคือนามสกุลไฟล์ ตัวอย่างการใช้งาน:
./scriptname ~/Dropbox/project/src java
มันน้อยกว่าชุดโซลูชั่นก่อนหน้า
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
ให้นับรวมสำหรับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย
HTH!
${-[*]} + $@
ตัวอย่างเช่น ซึ่งเป็นรหัสที่ถูกต้องแน่นอนที่ไหนสักแห่งในโลก ;) คุณหมายถึง \ s สำหรับพื้นที่
สิ่งนี้ให้นับจำนวนบรรทัดโดยไม่นับบรรทัดว่าง:
grep -v ^$ filename wc -l | sed -e 's/ //g'
rgrep . | wc -l
ให้นับบรรทัดที่ไม่ว่างในไดเรกทอรีการทำงานปัจจุบัน
มีโปรแกรมสำหรับสิ่งนี้บน linux ชื่อ 'wc'
แค่
wc -l *.c
และมันช่วยให้คุณมีบรรทัดทั้งหมดและบรรทัดสำหรับแต่ละไฟล์
wc
นับบรรทัดว่าง OP ต้องการนับบรรทัดที่ไม่ว่างเปล่า เป็นเรื่องจริงที่เขาจะต้องการใช้wc
แต่หลังจากได้รับการแก้ไขโดยใช้สตรีมแล้วเท่านั้นsed
foo.c
) มีความคิดเห็นเกี่ยวกับจำนวนบรรทัดในโปรเจ็กต์ (เช่นไฟล์จำนวนมากในโครงสร้างไดเร็กทอรีและไม่รวมไบนารีไฟล์)?