Làm thế nào để đếm dòng trong một tài liệu?


1077

Tôi có những dòng như thế này, và tôi muốn biết tôi thực sự có bao nhiêu dòng ...

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

Có cách nào để đếm tất cả chúng bằng các lệnh linux không?


4
Mở tệp bằng vim, sau đó nhập g <Ctrl-g>, Nó sẽ hiển thị cho bạn số dòng, từ, cột và byte
Luv33preet

31
@ Luv33preet sau đó bạn chỉ cần tìm lại chính mình trên SO, tìm kiếm cách thoát vim
Skylar Ittner

5
@SkylarIttner Và nếu bạn cần tìm cách thoát vim, <esc> :q!là câu trả lời duy nhất. (Đây là một trò đùa, điều này sẽ xóa tất cả các thay đổi chưa lưu
Ryan

Câu trả lời:


2030

Sử dụng wc:

wc -l <filename>

Điều này sẽ xuất số lượng dòng trong <filename>:

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

Hoặc, để bỏ qua việc <filename>sử dụng kết quả wc -l < <filename>:

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

Bạn cũng có thể dẫn dữ liệu vào wc:

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

18
điều đó thật tuyệt!! bạn có thể sử dụng awk để loại bỏ tên tệp được gắn vào số dòng như sau:wc -l <file> | awk '{print $1}
CheeHow

80
Thậm chí ngắn hơn, bạn có thể làmwc -l < <filename>
Hàng chục

5
@ GGB667 bạn cũng có thể thoát khỏi tên tệp bằngcat <file> | wc -l
baptx 10/2/2015

14
và với watch wc -l <filename>bạn có thể theo dõi tập tin này trong thời gian thực. Điều đó hữu ích cho các tệp nhật ký chẳng hạn.
DarkSide

27
Coi chừng wc -l tính "dòng mới". Nếu bạn có một tệp có 2 dòng văn bản và một ký hiệu "dòng mới" giữa chúng, wc sẽ xuất ra "1" thay vì "2".
Konstantin

140

Để đếm tất cả các dòng sử dụng:

$ wc -l file

Để lọc và chỉ đếm các dòng có mẫu sử dụng:

$ grep -w "pattern" -c file  

Hoặc sử dụng -v để đảo ngược khớp:

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

Xem trang grep man để xem các -e, -i và -x args ...


Kỳ lạ đôi khi các grep -ccông việc tốt hơn cho tôi. Chủ yếu là do wc -ltiền tố không gian đệm "tính năng" gây phiền nhiễu.
MarkHu


43

có rất nhiều cách. sử dụng wclà một.

wc -l file

những người khác bao gồm

awk 'END{print NR}' file

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

grep -c ".*" file

3
Có, nhưng wc -l filecung cấp cho bạn số dòng VÀ tên tệp để chỉ lấy tên tệp bạn có thể làm:filename.wc -l < /filepath/filename.ext
ggb667

Sử dụng đối số GNU grep -H trả về tên tệp và số đếm. grep -Hc ".*" file
Zlemini

Tôi đã bình chọn giải pháp này vì wc -ltính các ký tự dòng mới chứ không phải các dòng thực tế trong một tệp. Tất cả các lệnh khác có trong câu trả lời này sẽ cung cấp cho bạn số đúng trong trường hợp bạn cần các dòng.
gầm gừ

27

Công cụ wcnày là "bộ đếm từ" trong các hệ điều hành UNIX và UNIX, nhưng bạn cũng có thể sử dụng nó để đếm các dòng trong một tệp bằng cách thêm -ltùy chọn.

wc -l foosẽ đếm số lượng dòng trong foo. Bạn cũng có thể tạo đầu ra từ một chương trình như thế này : ls -l | wc -l, nó sẽ cho bạn biết có bao nhiêu tệp trong thư mục hiện tại (cộng với một).


3
ls -l | wc -l sẽ thực sự cung cấp cho bạn số lượng tệp trong thư mục +1 cho dòng kích thước tổng. bạn có thể làm ls -ld * | wc -lđể có được số lượng tập tin chính xác.
Joshua Lawrence Austill

24

Nếu bạn muốn kiểm tra tổng dòng của tất cả các tệp trong một thư mục, bạn có thể sử dụng find và wc:

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


15

Nếu tất cả những gì bạn muốn là số lượng dòng (chứ không phải số lượng dòng và tên tệp ngu ngốc quay trở lại):

wc -l < /filepath/filename.ext

Như đã đề cập trước đây, những thứ này cũng hoạt động (nhưng kém hơn vì những lý do khác):

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
Câu trả lời này đã được đăng 3 năm sau khi câu hỏi được hỏi và nó chỉ là sao chép những câu hỏi khác. Phần đầu tiên là tầm thường và phần thứ hai là tất cả câu trả lời của ghostdog đã được thêm vào. Hạ cấp.
fedorqui 'SO ngừng làm hại'

4 năm về .. xuống cấp. Hãy xem liệu chúng ta có thể có được một thập kỷ downvote dài!
Damien Roche

1
Không, bạn sai rồi; câu trả lời của ghostdog không trả lời câu hỏi ban đầu. Nó cung cấp cho bạn số lượng dòng VÀ tên tệp. Để chỉ lấy tên tệp, bạn có thể làm: filename.wc -l </filepath/filename.ext. Đó là lý do tại sao tôi đăng câu trả lời. awk, sed và grep đều là những cách làm kém hơn một chút. Cách thích hợp là cách tôi liệt kê.
ggb667

8

Sử dụng nlnhư thế này:

nl filename

Từ man nl:

Viết mỗi FILE vào đầu ra tiêu chuẩn, với số dòng được thêm vào. Không có TẬP_TIN hoặc khi TẬP TIN là -, hãy đọc đầu vào tiêu chuẩn.


Đây là câu trả lời đầu tiên tôi tìm thấy hoạt động với một tệp có một dòng văn bản không kết thúc trong một dòng mới, wc -lbáo cáo là 0. Cảm ơn bạn.
Scott Joudry

7

Tôi đã sử dụng cái này:

cat myfile.txt | wc -l

Tôi thích nó hơn câu trả lời được chấp nhận vì nó không in tên tệp và bạn không phải sử dụng awkđể sửa nó. Câu trả lời được chấp nhận:

wc -l myfile.txt

Nhưng tôi nghĩ câu trả lời hay nhất là câu trả lời của GGB667:

wc -l < myfile.txt

Tôi có thể sẽ sử dụng nó từ bây giờ. Nó hơi ngắn hơn cách của tôi. Tôi đang đưa ra cách làm cũ của mình trong trường hợp bất cứ ai thích nó. Đầu ra giống nhau với hai phương thức đó.


3
phương pháp đầu tiên và cuối cùng là như nhau. cái cuối cùng tốt hơn bởi vì nó không sinh ra một quá trình bổ sung

5

Trên đây là phương pháp ưa thích nhưng lệnh "cat" cũng có thể hữu ích:

cat -n <filename>

Sẽ hiển thị cho bạn toàn bộ nội dung của tập tin với số dòng.


5

Tôi đã thấy câu hỏi này trong khi tôi đang tìm cách đếm nhiều dòng tệp, vì vậy nếu bạn muốn đếm nhiều dòng tệp của tệp .txt, bạn có thể thực hiện việc này,

cat *.txt | wc -l

nó cũng sẽ chạy trên một tệp .txt;)


5

wc -l không tính dòng.

Vâng, câu trả lời này có thể hơi muộn cho bữa tiệc, nhưng tôi chưa tìm thấy ai có tài liệu giải pháp mạnh mẽ hơn trong các câu trả lời.

Trái với niềm tin phổ biến, POSIX không yêu cầu các tệp kết thúc bằng một ký tự dòng mới. Có, định nghĩa của Dòng POSIX 3.206 như sau:

Một chuỗi gồm 0 hoặc nhiều ký tự không phải <dòng mới> cộng với một ký tự kết thúc.

Tuy nhiên, điều mà nhiều người không biết là POSIX cũng định nghĩa Đường dây không hoàn chỉnh POSIX 3.195 là:

Một chuỗi gồm một hoặc nhiều ký tự không phải <dòng mới> ở cuối tệp.

Do đó, các tệp không có dấu vết LFlà hoàn toàn tuân thủ POSIX.

Nếu bạn chọn không hỗ trợ cả hai loại EOF, chương trình của bạn không tuân thủ POSIX.

Ví dụ, chúng ta hãy xem các tập tin sau.

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

Bất kể EOF, tôi chắc chắn bạn sẽ đồng ý rằng có hai dòng. Bạn đã tìm ra điều đó bằng cách xem có bao nhiêu dòng đã được bắt đầu, chứ không phải bằng cách xem có bao nhiêu dòng đã bị chấm dứt. Nói cách khác, theo POSIX, cả hai tệp này đều có cùng số lượng dòng:

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.

Trang người đàn ông tương đối rõ ràng về việc wcđếm dòng mới, với dòng mới chỉ là một 0x0aký tự:

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

Do đó, wcthậm chí không cố gắng đếm những gì bạn có thể gọi là "đường". Việc sử dụng wcđể đếm các dòng rất có thể dẫn đến sai sót, tùy thuộc vào EOF của tệp đầu vào của bạn.

Giải pháp tương thích POSIX

Bạn có thể sử dụng grepđể đếm các dòng giống như trong ví dụ trên. Giải pháp này vừa mạnh mẽ vừa chính xác hơn và nó hỗ trợ tất cả các hương vị khác nhau của dòng trong tệp của bạn có thể là:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': Để trả về số chữ số CHỈ .


3

Chuyển hướng / Đường ống đầu ra của tệp wc -lsẽ đủ, như sau:

cat /etc/fstab | wc -l

mà sau đó sẽ cung cấp không. chỉ dòng.


3

Hoặc đếm tất cả các dòng trong thư mục con với mẫu tên tệp (ví dụ: logfiles có dấu thời gian trong tên tệp):

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

2

Tôi biết điều này đã nhưng vẫn còn: Đếm các dòng được lọc

Tập tin của tôi trông như:

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

Nếu tôi muốn biết có bao nhiêu tệp được gửi OK:

grep "OK" <filename> | wc -l

HOẶC LÀ

grep -c "OK" filename

2

đếm số dòng và lưu trữ kết quả trong biến sử dụng lệnh này:

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


1

Như những người khác nói wc -llà giải pháp tốt nhất, nhưng để tham khảo trong tương lai, bạn có thể sử dụng Perl:

perl -lne 'END { print $. }'

$.chứa số dòng và ENDkhối sẽ thực thi ở cuối tập lệnh.


1
Không hoạt động:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW

1
@VeikkoW Làm việc cho tôi. Nếu bạn đang ở trên Windows, các quy tắc trích dẫn khác nhau sẽ được áp dụng; nhưng OP đã hỏi về Linux / Bash.
tripleee

1
perl -lne '}{ print $. 'làm như vậy.
Tom Fenech


1

wc -l <filename>

Điều này sẽ cung cấp cho bạn số lượng dòng và tên tệp trong đầu ra.

Ví dụ.

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

Đầu ra

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

Sử dụng

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

để chỉ nhận được số lượng dòng trong đầu ra.

Ví dụ.

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

Đầu ra

63


Đâu là lợi ích của việc lặp lại câu trả lời được chấp nhận (mười tuổi)?
Jeb

Bởi vì tôi không thể tìm thấy lệnh để chỉ lấy số dòng trong đầu ra trong luồng này.
Harsh Sarohi

Đây là ví dụ thứ hai trong câu trả lời được chấp nhận. wc -l < filename
Jeb

wc -l <filename> cung cấp tên tệp cũng như số lượng dòng trong đầu ra.
Harsh Sarohi

Không, wc -l < filenamekhác với wc -l filename, chuyển hướng sử dụng đầu tiên và sau đó không có bất kỳ tên tập tin trong đầu ra, như thể hiện trong các câu trả lời từ user85509
Jeb

1

Chức năng vỏ di động thả trong này [ℹ]   hoạt động như một bùa. Chỉ cần thêm đoạn mã sau vào .bashrctệp của bạn (hoặc tương đương với môi trường shell của bạn) .

# ---------------------------------------------
#  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:]]}
}

Điều này phải hoàn toàn tương thích với tất cả các shell tương thích POSIX ngoài bashzsh .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.