Bir belgedeki satırlar nasıl sayılır?


1076

Bunun gibi çizgilerim var ve aslında kaç tane çizgim olduğunu bilmek istiyorum ...

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 komutlarını kullanarak hepsini saymanın bir yolu var mı?


4
Vim kullanarak dosyayı açın, sonra yazın g <Ctrl-g>, size satır, kelime, sütun ve bayt sayısını gösterecektir
Luv33preet

30
@ Luv33preet o zaman sadece sola geri kendinizi bulmak, vim çıkmak nasıl ararken
Skylar Ittner

5
@SkylarIttner Ve vim'den nasıl çıkacağınıza bakmanız gerekiyorsa <esc> :q!, tek cevap budur. (Bu bir şaka, kaydedilmemiş tüm değişiklikleri silecektir - şaka, vim bilmiyorsanız bir dosyayı karıştırmanın kolay olduğu, kaydetmemesi daha iyi olacaktır).
Ryan

Yanıtlar:


2030

Kullanım wc:

wc -l <filename>

Bu, aşağıdaki satır sayısını verir <filename>:

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

Veya, <filename>sonuçtan atlamak için şunu kullanın wc -l < <filename>:

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

Verileri ayrıca aşağıdakilere de ekleyebilirsiniz wc:

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

18
bu harika!! satır numarasına ekli dosya adından kurtulmak için awk kullanabilirsiniz:wc -l <file> | awk '{print $1}
CheeHow

80
Daha da kısa, yapabilirsinizwc -l < <filename>
Tensigh

5
@ GGB667 ile dosya adından da kurtulabilirsinizcat <file> | wc -l
baptx

14
ve watch wc -l <filename>bu dosyayı gerçek zamanlı olarak takip edebilirsiniz. Bu, örneğin günlük dosyaları için kullanışlıdır.
DarkSide

27
Dikkat wc -l "satırsonu" sayar. 2 satır metin ve aralarında bir "yeni satır" sembolü olan bir dosyanız varsa, wc "2" yerine "1" çıktısını verir.
Konstantin

140

Tüm satırları saymak için şunu kullanın:

$ wc -l file

Yalnızca desen kullanan satırları filtrelemek ve saymak için:

$ grep -w "pattern" -c file  

Veya eşleşmeyi ters çevirmek için -v'yi kullanın:

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

-E, -i ve -x argümanlarına göz atmak için grep man sayfasına bakın ...


İşin garibi bazen grep -cbenim için daha iyi çalışıyor. Temelde wc -lcan sıkıcı "özellik" dolgu alanı öneki nedeniyle.
MarkHu


43

birçok yolu var. kullanma wcbirdir.

wc -l file

diğerleri

awk 'END{print NR}' file

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

grep -c ".*" file

3
Evet, ancak wc -l filesatır sayısını VE sadece dosya filename.wc -l < /filepath/filename.ext
adını

GNU grep -H bağımsız değişkenini kullanmak dosya adı ve sayı döndürür. grep -Hc ".*" file
Zlemini

Bu çözümlere oy verdim çünkü wc -lbir dosyadaki gerçek satırları değil, yeni satır karakterlerini sayar. Bu cevaba dahil edilen diğer tüm komutlar, satırlara ihtiyacınız olması durumunda size doğru sayıyı verecektir.
growlingchaos

27

Araç wc, UNIX ve UNIX benzeri işletim sistemlerindeki "sözcük sayacı" dır, ancak -lseçeneği ekleyerek dosyadaki satırları saymak için de kullanabilirsiniz .

wc -l fooiçindeki satır sayısını sayar foo. Ayrıca ls -l | wc -l, geçerli dizinde (artı bir) kaç dosya olduğunu bildiren böyle bir programdan çıktı da iletebilirsiniz .


3
ls -l | wc -l aslında toplam boyut satırı için +1 dizinindeki dosya sayısını verecektir. ls -ld * | wc -ldoğru sayıda dosya almak için yapabilirsiniz .
Joshua Lawrence Austill

24

Bir dizindeki tüm dosyaların toplam satırını kontrol etmek istiyorsanız, find ve wc komutunu kullanabilirsiniz:

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


15

İstediğiniz satır sayısı (satır sayısı ve geri gelen aptal dosya adı değil) ise:

wc -l < /filepath/filename.ext

Daha önce de belirtildiği gibi, bunlar da işe yarıyor (ancak diğer nedenlerden daha düşük):

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
Bu cevap, soru sorulduktan 3 yıl sonra yayınlandı ve sadece başkalarını kopyalıyor. İlk kısım önemsiz ve ikincisi ise hayalet köpeğin cevabının eklenmesiydi. Downvoting.
fedorqui 'SO' zarar vermeyi durdurun '

4 yıl sonra .. downvoting. Bakalım on yıl kadar uzun bir düşüş çizgisi alabilir miyiz!
Damien Roche

1
Hayır hatalısın; Ghosthost'un cevabı orijinal soruya cevap vermiyor. Size satır sayısını VE dosya adını verir. Yalnızca dosya adını almak için şunları yapabilirsiniz: dosyaadı.wc -l </filepath/filename.ext. Bu yüzden cevabı gönderdim. awk, sed ve grep, bunu yapmanın biraz daha düşük yollarıdır. Doğru yol listelediğim.
ggb667

8

Bunun nlgibi kullanın :

nl filename

Gönderen man nl:

Satır numaraları eklenmiş olarak her DOSYAYI standart çıktıya yazın. DOSYA olmadan veya DOSYA - olduğunda standart girişi okuyun.


Bu, yeni satırda bitmeyen ve wc -l0 olarak bildiren tek bir metin satırına sahip bir dosyayla çalışan ilk yanıttır . Teşekkür ederim.
Scott Joudry

7

Bunu kullanıyorum:

cat myfile.txt | wc -l

Kabul edilen yanıta tercih ederim, çünkü dosya adını yazdırmaz ve bunu awkdüzeltmek için kullanmanız gerekmez . Kabul edilen cevap:

wc -l myfile.txt

Ama bence en iyisi GGB667'nin cevabı:

wc -l < myfile.txt

Muhtemelen bundan sonra kullanacağım. Benim yolumdan biraz daha kısa. Herkesin tercih etmesi durumunda eski tarzımı koyuyorum. Çıktı, bu iki yöntemle aynıdır.


3
ilk ve son yöntem aynıdır. sonuncusu daha iyidir çünkü fazladan bir süreç ortaya

5

Yukarıda tercih edilen yöntem, ancak "cat" komutu da yardımcı olabilir:

cat -n <filename>

Satır numaralarına sahip dosyanın tüm içeriğini gösterecektir.


5

Birden fazla dosya satırını saymanın bir yolunu ararken bu soruyu gördüm, bu nedenle bir .txt dosyasının birden çok dosya satırını saymak istiyorsanız bunu yapabilirsiniz,

cat *.txt | wc -l

ayrıca bir .txt dosyasında da çalışır;)


5

wc -l satırları saymaz.

Evet, bu cevap partiye biraz geç olabilir, ancak cevaplarda henüz daha sağlam bir çözüm olduğunu kimsenin bulamadım.

Popüler inanışın aksine, POSIX dosyaların hiçbir satırsonu karakteriyle bitmesini gerektirmez. Evet, POSIX 3.206 Satırının tanımı aşağıdaki gibidir:

Sıfır veya daha fazla <newline> olmayan bir karakter artı bir sonlandırıcı karakter.

Ancak, pek çok kişinin farkında olmadığı şey POSIX'in POSIX 3.195 Tamamlanmamış Hattı'nı şu şekilde tanımlamasıdır :

Dosyanın sonunda bir veya daha fazla <newline> olmayan karakter dizisi.

Bu nedenle, iz bırakmayan dosyalar LFmükemmel POSIX uyumludur.

Her iki EOF türünü de desteklememeyi seçerseniz, programınız POSIX uyumlu değildir.

Örnek olarak, aşağıdaki dosyaya bakalım.

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

EOF ne olursa olsun, eminim ki iki çizgi vardır. Bunu kaç satır sonlandığına bakarak değil, kaç satırın sonlandırıldığına bakarak anladınız. Başka bir deyişle, POSIX'e göre, bu iki dosyanın her ikisi de aynı miktarda satıra sahiptir:

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.

Man sayfası, wcyeni satır sayma konusunda nispeten açıktır ve yeni satır sadece bir 0x0akarakterdir:

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

Bu nedenle, wc"çizgi" diyebileceğiniz şeyi saymaya bile kalkışmaz. wcSatırları saymak için kullanmak , giriş dosyanızın EOF'sine bağlı olarak yanlış sayımlara yol açabilir.

POSIX uyumlu çözüm

Yukarıdaki örnekte olduğu gibi çizgilerigrep saymak için kullanabilirsiniz . Bu çözüm hem daha sağlam hem de hassastır ve dosyanızdaki bir satırın ne olabileceğinin tüm farklı lezzetlerini destekler:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': SADECE rakamları döndürmek için .


3

wc -lAşağıdaki gibi dosyanın çıktısını yeniden yönlendirme / borulama yeterli olmalıdır:

cat /etc/fstab | wc -l

o zaman hayır sağlayacaktır. yalnızca satır.


3

Alternatif olarak, alt dizinlerdeki tüm dosya adlarını bir desen (örneğin, dosya adında zaman damgaları olan günlük dosyaları) ile sayın:

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

2

Biliyorum bu eski ama hala: Filtrelenmiş hatları say

Dosyam şöyle görünüyor:

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

Kaç dosya gönderildiğini bilmek istersem Tamam:

grep "OK" <filename> | wc -l

VEYA

grep -c "OK" filename

2

satır sayısını sayın ve sonucu depola değişkenini şu komutu kullanın:

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


1

Diğerlerinin söylediği gibi wc -len iyi çözümdür, ancak ileride başvurmak için Perl'i kullanabilirsiniz:

perl -lne 'END { print $. }'

$.satır numarasını içerir ve ENDkomut dosyasının sonunda blok yürütülür.


1
dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
Çalışmıyor

1
@VeikkoW Benim için çalışıyor. Windows'daysanız, farklı alıntı kuralları geçerlidir; ama OP Linux / Bash hakkında sordu.
tripleee

1
perl -lne '}{ print $. 'aynısını yapar.
Tom Fenech


1

wc -l <filename>

Bu size çıktıdaki satır sayısını ve dosya adını verecektir.

Örneğin.

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

Çıktı

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

kullanım

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

çıktıda sadece satır sayısı elde etmek için.

Örneğin.

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

Çıktı

63


Kabul edilen (on yaşında) cevabı tekrarlamanın yararı nerededir?
jeb

Çünkü bu iş parçacığındaki çıktıda yalnızca satır numaraları almak için komut bulamadım.
Harsh Sarohi

Kabul edilen cevapta ikinci örnek. wc -l < filename
jeb

wc -l <dosyaadı> çıktıdaki satır sayısını ve dosya adını verir.
Harsh Sarohi

Hayır, wc -l < filenamefarklıdır wc -l filename, ilk yönlendirme kullanır ve sonra çıktıda herhangi bir dosya adı yoktur , user85509
jeb

1

Bu açılan portatif kabuk işlevi [ℹ]   bir cazibe gibi çalışır. .bashrcDosyanıza (veya kabuk ortamınızın eşdeğeri) aşağıdaki snippet'i eklemeniz yeterlidir .

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

Bu, bash ve zsh'a ek olarak POSIX uyumlu tüm mermilerle tamamen uyumlu olmalıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.