วิธีการนับบรรทัดในเอกสาร?


1076

ฉันมีเส้นแบบนี้และฉันอยากรู้ว่าฉันมีหลายเส้นจริง ๆ ...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

มีวิธีการนับพวกเขาทั้งหมดโดยใช้คำสั่ง linux หรือไม่


4
เปิดไฟล์โดยใช้ vim จากนั้นพิมพ์g <Ctrl-g>จะแสดงจำนวนบรรทัดคำคอลัมน์และไบต์
Luv33preet

30
@ Luv33preet จากนั้นคุณก็พบว่าตัวเองกลับมาดังนั้นค้นหาวิธีออกเป็นกลุ่ม
Skylar Ittner

5
@SkylarIttner และถ้าคุณต้องการค้นหาวิธีออกเป็นกลุ่ม<esc> :q!คำตอบเดียวคือ (นี่เป็นเรื่องตลกสิ่งนี้จะลบการเปลี่ยนแปลงที่ยังไม่ได้บันทึกทั้งหมด - เรื่องตลกคือถ้าคุณไม่รู้ว่าเป็นกลุ่มมันง่ายที่จะทำไฟล์ให้ยุ่งดังนั้นดีกว่าอย่าบันทึกไว้)
Ryan

คำตอบ:


2030

ใช้wc:

wc -l <filename>

จะส่งออกจำนวนบรรทัดใน<filename>:

$ wc -l /dir/file.txt
3272485 /dir/file.txt

หรือเพื่อละเว้น<filename>จากการใช้ผลwc -l < <filename>:

$ wc -l < /dir/file.txt
3272485

คุณยังสามารถไพพ์ข้อมูลด้วยwcเช่นกัน:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
นี่มันเยี่ยมมาก !! คุณอาจใช้ awk เพื่อกำจัดชื่อไฟล์ต่อท้ายหมายเลขบรรทัดเช่น:wc -l <file> | awk '{print $1}
CheeHow

80
ยิ่งสั้นลงคุณสามารถทำได้wc -l < <filename>
Tensigh

5
@ GGB667 คุณสามารถกำจัดชื่อไฟล์ด้วยcat <file> | wc -l
baptx

14
และwatch wc -l <filename>คุณสามารถติดตามไฟล์นี้แบบเรียลไทม์ได้ มันมีประโยชน์สำหรับล็อกไฟล์เช่น
DarkSide

27
ระวังว่า wc -l นับ "newlines" หากคุณมีไฟล์ที่มีข้อความ 2 บรรทัดและสัญลักษณ์ "newline" หนึ่งบรรทัดอยู่ระหว่างนั้น wc จะส่งออก "1" แทน "2"
Konstantin

140

ในการนับจำนวนบรรทัดให้ใช้:

$ wc -l file

หากต้องการกรองและนับเฉพาะบรรทัดที่มีรูปแบบให้ใช้:

$ grep -w "pattern" -c file  

หรือใช้ -v เพื่อสลับการจับคู่:

$ grep -w "pattern" -c -v file 

ดูหน้า man grep เพื่อดูที่ -e, -i และ -x args ...


บางครั้งผิดปกติgrep -cทำงานได้ดีขึ้นสำหรับฉัน สาเหตุหลักมาจากwc -lคำนำหน้า "ช่องว่าง" ที่น่ารำคาญ
MarkHu


43

มีหลายวิธี ใช้wcเป็นหนึ่ง

wc -l file

อื่น ๆ รวมถึง

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
ใช่ แต่wc -l fileให้จำนวนบรรทัดและชื่อไฟล์ที่จะได้รับเพียงชื่อไฟล์ที่คุณสามารถทำได้:filename.wc -l < /filepath/filename.ext
ggb667

การใช้อาร์กิวเมนต์ GNU grep -H จะส่งคืนชื่อไฟล์และจำนวน grep -Hc ".*" file
Zlemini

ฉันโหวตโซลูชันนี้เนื่องจากwc -lนับจำนวนอักขระบรรทัดใหม่ไม่ใช่บรรทัดจริงในไฟล์ คำสั่งอื่น ๆ ทั้งหมดที่รวมอยู่ในคำตอบนี้จะให้หมายเลขที่ถูกต้องในกรณีที่คุณต้องการบรรทัด
growlingchaos

27

เครื่องมือwcนี้เป็น "ตัวนับคำ" ในระบบปฏิบัติการ UNIX และ UNIX ที่คล้ายกัน แต่คุณสามารถใช้มันเพื่อนับบรรทัดในไฟล์โดยเพิ่ม-lตัวเลือก

wc -l foofooจะนับจำนวนของสายใน นอกจากนี้คุณยังสามารถไพพ์เอาท์พุทจากโปรแกรมดังนี้: ls -l | wc -lซึ่งจะบอกคุณว่ามีไฟล์กี่ไฟล์ในไดเรกทอรีปัจจุบัน (บวกหนึ่ง)


3
ls -l | wc -l จริง ๆ แล้วจะให้จำนวนไฟล์ในไดเรกทอรี +1 สำหรับบรรทัดขนาดรวม คุณสามารถทำได้ls -ld * | wc -lเพื่อให้ได้จำนวนไฟล์ที่ถูกต้อง
Joshua Lawrence Austill

24

หากคุณต้องการตรวจสอบบรรทัดรวมของไฟล์ทั้งหมดในไดเรกทอรีคุณสามารถใช้ find และ wc:

find . -type f -exec wc -l {} +


15

หากสิ่งที่คุณต้องการคือจำนวนบรรทัด (ไม่ใช่จำนวนบรรทัดและชื่อไฟล์โง่ ๆ กลับมา):

wc -l < /filepath/filename.ext

ดังที่ได้กล่าวไปแล้วสิ่งเหล่านี้ยังใช้งานได้ (แต่ด้อยกว่าด้วยเหตุผลอื่น):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
คำตอบนี้ถูกโพสต์เมื่อ 3 ปีหลังจากมีการถามคำถามและเป็นเพียงการคัดลอกคำถามอื่น ส่วนแรกเป็นเรื่องไม่สำคัญและส่วนที่สองคือคำตอบของ ghostdogทั้งหมดที่เพิ่มเข้ามา downvoting
fedorqui 'ดังนั้นหยุดการทำร้าย'

4 ปีใน .. การลงคะแนน เรามาดูกันว่าเราจะได้รับ downvote ในช่วงสิบปีที่ยาวนานหรือไม่!
ดาเมียนโรช

1
ไม่คุณผิด คำตอบของ ghostdog ไม่ตอบคำถามเดิม มันทำให้คุณมีจำนวนบรรทัดและชื่อไฟล์ ในการรับชื่อไฟล์คุณสามารถทำได้: filename.wc -l </filepath/filename.ext นี่คือเหตุผลที่ฉันโพสต์คำตอบ awk, sed และ grep เป็นวิธีที่ด้อยกว่าเล็กน้อยในการทำเช่นนี้ วิธีที่เหมาะสมคือวิธีที่ฉันแจ้งไว้
ggb667

8

ใช้nlแบบนี้:

nl filename

จากman nl:

เขียนแต่ละไฟล์ไปยังเอาต์พุตมาตรฐานโดยเพิ่มหมายเลขบรรทัด ไม่มีไฟล์หรือเมื่อไฟล์เป็น - อ่านอินพุตมาตรฐาน


นี่เป็นคำตอบแรกที่ฉันพบว่าทำงานได้กับไฟล์ที่มีข้อความบรรทัดเดียวที่ไม่ได้ขึ้นบรรทัดใหม่ซึ่งwc -lรายงานว่าเป็น 0 ขอบคุณ
Scott Joudry

7

ฉันใช้สิ่งนี้:

cat myfile.txt | wc -l

ฉันชอบมันมากกว่าคำตอบที่ยอมรับเพราะมันไม่ได้พิมพ์ชื่อไฟล์และคุณไม่ต้องใช้awkเพื่อแก้ไข คำตอบที่ยอมรับ:

wc -l myfile.txt

แต่ฉันคิดว่าคำตอบที่ดีที่สุดคือ GGB667:

wc -l < myfile.txt

ฉันอาจจะใช้มันต่อจากนี้ไป มันสั้นกว่าวิธีของฉันเล็กน้อย ฉันเลิกใช้วิธีการแบบเดิมในกรณีที่ใคร ๆ ก็ชอบ ผลลัพธ์จะเหมือนกันกับทั้งสองวิธี


3
วิธีแรกและวิธีสุดท้ายเหมือนกัน อันสุดท้ายนั้นดีกว่าเพราะมันไม่ได้เกิดกระบวนการพิเศษ

5

ด้านบนเป็นวิธีที่ต้องการ แต่คำสั่ง "cat" ก็มีประโยชน์เช่นกัน:

cat -n <filename>

จะแสดงเนื้อหาทั้งหมดของไฟล์พร้อมหมายเลขบรรทัด


5

ฉันเห็นคำถามนี้ในขณะที่ฉันกำลังมองหาวิธีนับจำนวนไฟล์หลายบรรทัดดังนั้นหากคุณต้องการนับจำนวนไฟล์หลายบรรทัดในไฟล์. txt คุณสามารถทำได้

cat *.txt | wc -l

มันจะทำงานบนไฟล์. txt ไฟล์เดียว;)


5

wc -l ไม่นับบรรทัด

ใช่คำตอบนี้อาจจะช้าไปงานปาร์ตี้ แต่ฉันยังไม่พบใครเลยที่เป็นทางออกที่ดีกว่าในคำตอบ

ตรงกันข้ามกับความเชื่อที่เป็นที่นิยม POSIX ไม่ต้องการไฟล์ที่จะจบด้วยอักขระขึ้นบรรทัดใหม่เลย ใช่คำจำกัดความของPOSIX 3.206 Lineมีดังนี้:

ลำดับของอักขระที่ไม่ใช่ <newline> ที่เป็นศูนย์หรือมากกว่ารวมถึงอักขระที่ยกเลิก

อย่างไรก็ตามสิ่งที่หลายคนไม่ทราบคือ POSIX ยังกำหนดPOSIX 3.195 Incomplete Lineเป็น:

ลำดับของอักขระที่ไม่ใช่ <newline> ตั้งแต่หนึ่งตัวขึ้นไปที่ท้ายไฟล์

ดังนั้นไฟล์ที่ไม่มีส่วนท้ายLFจะเข้ากันได้กับ POSIX อย่างสมบูรณ์แบบ

หากคุณเลือกที่จะไม่สนับสนุน EOF ทั้งสองประเภทโปรแกรมของคุณไม่ได้มาตรฐาน POSIX

ตัวอย่างเช่นลองดูที่ไฟล์ต่อไปนี้

1 This is the first line.
2 This is the second line.

ไม่ว่า EOF ฉันมั่นใจว่าคุณจะเห็นด้วยว่ามีสองบรรทัด คุณคิดออกโดยดูว่ามีกี่บรรทัดที่เริ่มต้นไม่ใช่โดยดูที่จำนวนบรรทัดที่ถูกยกเลิก กล่าวอีกนัยหนึ่งตาม POSIX ทั้งสองไฟล์มีจำนวนบรรทัดเท่ากัน:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

หน้าคนค่อนข้างชัดเจนเกี่ยวกับการwcนับบรรทัดใหม่ด้วยการขึ้นบรรทัดใหม่เพียงแค่0x0aตัวละคร:

NAME
       wc - print newline, word, and byte counts for each file

ดังนั้นwcอย่าพยายามนับสิ่งที่คุณอาจเรียกว่า "เส้น" การใช้wcในการนับจำนวนบรรทัดสามารถนำไปสู่การผิดพลาดได้มากขึ้นอยู่กับ EOF ของไฟล์อินพุตของคุณ

โซลูชันที่สอดคล้องกับ POSIX

คุณสามารถใช้grepเพื่อนับจำนวนบรรทัดได้ตามตัวอย่างด้านบน โซลูชันนี้มีทั้งความแข็งแกร่งและแม่นยำยิ่งขึ้นและรองรับรสชาติที่แตกต่างกันทั้งหมดของไฟล์ในบรรทัดของคุณ:

$ grep -c ^ FILE



3

Redirection / Piping output ของไฟล์ที่wc -lควรจะพอเพียงดังต่อไปนี้:

cat /etc/fstab | wc -l

ซึ่งจะให้หมายเลข ของสายเท่านั้น


3

หรือนับบรรทัดทั้งหมดในไดเรกทอรีย่อยด้วยรูปแบบชื่อไฟล์ (เช่น logfiles ที่มีการประทับเวลาในชื่อไฟล์):

wc -l ./**/*_SuccessLog.csv

2

ฉันรู้ว่ามันเก่าแต่ก็ยัง: นับบรรทัดที่กรอง

ไฟล์ของฉันดูเหมือนว่า:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

ถ้าฉันต้องการทราบจำนวนไฟล์ที่ส่งตกลง:

grep "OK" <filename> | wc -l

หรือ

grep -c "OK" filename

2

นับจำนวนบรรทัดและเก็บผลลัพธ์ในตัวแปรใช้คำสั่งนี้:

count=$(wc -l < file.txt) echo "Number of lines: $count"


1

อย่างที่คนอื่นพูดว่าwc -lเป็นทางออกที่ดีที่สุด แต่สำหรับการอ้างอิงในอนาคตคุณสามารถใช้ Perl:

perl -lne 'END { print $. }'

$.มีหมายเลขบรรทัดและENDบล็อกจะดำเนินการในตอนท้ายของสคริปต์


1
ไม่ทำงาน:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW

1
@VikikW ใช้งานได้สำหรับฉัน หากคุณใช้ Windows จะมีการใช้กฎการอ้างอิงที่แตกต่างกัน แต่ OP ถามเกี่ยวกับ Linux / Bash
tripleee

1
perl -lne '}{ print $. 'ทำเช่นเดียวกัน
Tom Fenech


1

wc -l <filename>

สิ่งนี้จะให้จำนวนบรรทัดและชื่อไฟล์ในเอาต์พุต

เช่น.

wc -l 24-11-2019-04-33-01-url_creator.log

เอาท์พุต

63 24-11-2019-04-33-01-url_creator.log

ใช้

wc -l <filename>|cut -d\ -f 1

เพื่อรับจำนวนบรรทัดเท่านั้นในเอาต์พุต

เช่น.

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

เอาท์พุต

63


ประโยชน์ของการทำซ้ำคำตอบที่ยอมรับ (อายุสิบปี) อยู่ที่ไหน
jeb

เพราะฉันไม่พบคำสั่งให้รับเฉพาะหมายเลขบรรทัดในเอาต์พุตในเธรดนี้
Harsh Sarohi

เป็นตัวอย่างที่สองในคำตอบที่ยอมรับได้ wc -l < filename
jeb

wc -l <filename> ให้ชื่อไฟล์รวมทั้งจำนวนบรรทัดในเอาต์พุต
Harsh Sarohi

ไม่wc -l < filenameต่างwc -l filenameจากครั้งแรกที่ใช้การเปลี่ยนเส้นทางจากนั้นไม่มีชื่อไฟล์ใด ๆ ในผลลัพธ์เช่นแสดงในคำตอบจากผู้ใช้ 85509
jeb

1

ฟังก์ชั่นเปลือกแบบพกพาแบบหล่นในนี้[ℹ] ใช้   งานได้อย่างมีเสน่ห์ เพียงแค่เพิ่มตัวอย่างต่อไปนี้ที่คุณ.bashrcไฟล์(หรือเทียบเท่าสำหรับสภาพแวดล้อมเปลือกของคุณ)

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

นี้ควรจะเป็นอย่างเข้ากันได้กับทุกเปลือก POSIX สอดคล้องนอกเหนือจากการทุบตีและzsh

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.