Bagaimana cara menghitung baris dalam dokumen?

1077

Saya memiliki garis seperti ini, dan saya ingin tahu berapa banyak garis yang sebenarnya saya miliki ...

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

Apakah ada cara untuk menghitung semuanya menggunakan perintah linux?

Alucard
sumber
4
Buka file menggunakan vim, lalu ketik g <Ctrl-g>, Ini akan menampilkan jumlah baris, kata, kolom dan byte
Luv33preet
31
@ Luv33preet maka Anda cukup menemukan diri Anda kembali pada SO, mencari cara untuk keluar vim
Skylar Ittner
5
@ SkylarIttner Dan jika Anda perlu mencari cara keluar vim, <esc> :q!adalah satu-satunya jawaban. (Ini adalah lelucon, ini akan menghapus semua perubahan yang belum disimpan — leluconnya adalah jika Anda tidak tahu vim, mudah untuk mengacaukan file, jadi lebih baik tidak menyimpannya).
Ryan

Jawaban:

2031

Gunakan wc:

wc -l <filename>

Ini akan menampilkan jumlah baris dalam <filename>:

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

Atau, untuk menghilangkan <filename>dari hasil gunakan wc -l < <filename>:

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

Anda juga dapat mengirim data ke pipa wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63
pengguna85509
sumber
18
ini bagus !! Anda mungkin menggunakan awk untuk menyingkirkan nama file yang ditambahkan ke nomor baris seperti itu:wc -l <file> | awk '{print $1}
CheeHow
80
Bahkan lebih pendek, Anda bisa melakukannyawc -l < <filename>
Tensigh
5
@ GGB667 Anda juga dapat menyingkirkan nama file dengancat <file> | wc -l
baptx
14
dan dengan watch wc -l <filename>Anda dapat mengikuti file ini secara real-time. Itu berguna untuk file log misalnya.
DarkSide
27
Waspadalah bahwa wc-l menghitung "baris baru". Jika Anda memiliki file dengan 2 baris teks dan satu simbol "baris baru" di antara mereka, wc akan menampilkan "1" alih-alih "2".
Konstantin
140

Untuk menghitung semua baris gunakan:

$ wc -l file

Untuk memfilter dan menghitung hanya garis yang menggunakan pola:

$ grep -w "pattern" -c file  

Atau gunakan -v untuk membalikkan kecocokan:

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

Lihat halaman manual grep untuk melihat argumen -e, -i dan -x ...

Lauro Oliveira
sumber
Anehnya kadang-kadang grep -cbekerja lebih baik untuk saya. Terutama karena wc -l"fitur" padding awalan ruang yang mengganggu.
MarkHu
75
wc -l <file.txt>

Atau

command | wc -l
John Kugelman
sumber
43

ada banyak cara. menggunakan wcadalah satu.

wc -l file

yang lain termasuk

awk 'END{print NR}' file

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

grep -c ".*" file
ghostdog74
sumber
3
Ya, tetapi wc -l filememberi Anda jumlah baris DAN nama file untuk mendapatkan hanya nama file yang dapat Anda lakukan:filename.wc -l < /filepath/filename.ext
ggb667
Menggunakan argumen GNU grep -H mengembalikan nama file dan menghitung. grep -Hc ".*" file
Zlemini
Saya memilih solusi ini karena wc -lmenghitung karakter baris baru dan bukan baris aktual dalam file. Semua perintah lain yang termasuk dalam jawaban ini akan memberi Anda nomor yang tepat jika Anda membutuhkannya.
growlingchaos
27

Alat wcini adalah "penghitung kata" dalam sistem operasi UNIX dan mirip UNIX, tetapi Anda juga dapat menggunakannya untuk menghitung baris dalam file dengan menambahkan -lopsi.

wc -l fooakan menghitung jumlah baris dalam foo. Anda juga dapat mem-pipe output dari program seperti ini:, ls -l | wc -lyang akan memberi tahu Anda berapa banyak file di direktori saat ini (ditambah satu).

built1n
sumber
3
ls -l | wc -l sebenarnya akan memberi Anda jumlah file dalam direktori +1 untuk garis ukuran total. Anda dapat melakukannya ls -ld * | wc -luntuk mendapatkan jumlah file yang benar.
Joshua Lawrence Austill
24

Jika Anda ingin memeriksa baris total semua file dalam direktori, Anda dapat menggunakan find dan wc:

find . -type f -exec wc -l {} +
storen
sumber
21

Gunakan wc:

wc -l <filename>
Vivin Paliath
sumber
15

Jika yang Anda inginkan adalah jumlah baris (dan bukan jumlah baris serta nama file bodoh yang muncul kembali):

wc -l < /filepath/filename.ext

Seperti yang disebutkan sebelumnya ini juga berfungsi (tetapi lebih rendah karena alasan lain):

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
ggb667
sumber
3
Jawaban ini diposting 3 tahun setelah pertanyaan diajukan dan hanya menyalin yang lain. Bagian pertama adalah sepele dan yang kedua adalah jawaban semua ghostdog menambahkan. Downvoting.
fedorqui 'SO berhenti merugikan'
4 tahun berlalu .. downvoting. Mari kita lihat apakah kita bisa mendapatkan satu dekade penurunan suara yang panjang!
Damien Roche
1
Tidak, Anda salah; jawaban ghostdog tidak menjawab pertanyaan aslinya. Ini memberi Anda jumlah baris DAN nama file. Untuk mendapatkan hanya nama file yang dapat Anda lakukan: filename.wc -l </filepath/filename.ext. Itulah sebabnya saya memposting jawabannya. awk, sed dan grep adalah cara yang sedikit lebih rendah untuk melakukan ini. Cara yang tepat adalah yang saya daftarkan.
ggb667
8

Gunakan nlseperti ini:

nl filename

Dari man nl:

Tulis setiap FILE ke output standar, dengan nomor baris ditambahkan. Tanpa FILE, atau ketika FILE adalah -, baca input standar.

desimal
sumber
Ini adalah jawaban pertama yang saya temukan yang berfungsi dengan file yang memiliki satu baris teks yang tidak berakhir pada baris baru, yang wc -ldilaporkan sebagai 0. Terima kasih.
Scott Joudry
7

Saya telah menggunakan ini:

cat myfile.txt | wc -l

Saya lebih suka daripada jawaban yang diterima karena tidak mencetak nama file, dan Anda tidak perlu menggunakannya awkuntuk memperbaikinya. Jawaban yang diterima:

wc -l myfile.txt

Tapi saya pikir yang terbaik adalah jawaban GGB667:

wc -l < myfile.txt

Saya mungkin akan menggunakannya mulai sekarang. Ini sedikit lebih pendek dari jalanku. Saya memasang cara lama saya kalau-kalau ada yang lebih suka. Outputnya sama dengan kedua metode tersebut.

Butkus Buttle
sumber
3
metode pertama dan terakhir adalah sama. yang terakhir lebih baik karena tidak menelurkan proses ekstra
5

Di atas adalah metode yang disukai tetapi perintah "cat" juga dapat membantu:

cat -n <filename>

Akan menampilkan seluruh isi file dengan nomor baris.

Yogi
sumber
5

Saya melihat pertanyaan ini ketika saya sedang mencari cara untuk menghitung beberapa baris file, jadi jika Anda ingin menghitung beberapa baris file dari file .txt Anda dapat melakukan ini,

cat *.txt | wc -l

itu juga akan berjalan pada satu file .txt;)

taliboni
sumber
5

wc -l tidak menghitung garis.

Ya, jawaban ini mungkin agak terlambat untuk pesta, tetapi saya belum menemukan orang yang mendokumentasikan solusi yang lebih kuat dalam jawaban.

Bertentangan dengan kepercayaan populer, POSIX tidak memerlukan file untuk diakhiri dengan karakter baris baru sama sekali. Ya, definisi Baris POSIX 3.206 adalah sebagai berikut:

Urutan nol atau lebih karakter non-<newline> ditambah karakter terminating.

Namun, yang tidak disadari banyak orang adalah bahwa POSIX juga mendefinisikan POSIX 3.195 Incomplete Line sebagai:

Urutan satu atau lebih karakter bukan <newline> di akhir file.

Oleh karena itu, file tanpa trailing LFsepenuhnya kompatibel dengan POSIX.

Jika Anda memilih untuk tidak mendukung kedua jenis EOF, program Anda tidak kompatibel dengan POSIX.

Sebagai contoh, mari kita lihat file berikut.

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

Tidak masalah EOF, saya yakin Anda akan setuju bahwa ada dua baris. Anda mengetahuinya dengan melihat berapa banyak garis telah dimulai, bukan dengan melihat berapa banyak garis telah diakhiri. Dengan kata lain, sesuai POSIX, kedua file ini memiliki jumlah baris yang sama:

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.

Halaman manual relatif jelas tentang wcpenghitungan baris baru, dengan baris baru yang hanya menjadi 0x0akarakter:

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

Karenanya, wcbahkan tidak berupaya menghitung apa yang Anda sebut "saluran". Menggunakan wcuntuk menghitung garis dapat menyebabkan kesalahan perhitungan, tergantung pada EOF dari file input Anda.

Solusi yang sesuai dengan POSIX

Anda dapat menggunakan grepuntuk menghitung garis seperti pada contoh di atas. Solusi ini lebih kuat dan tepat, dan mendukung semua rasa berbeda dari apa yang bisa menjadi garis dalam file Anda:

$ grep -c ^ FILE
Chiru
sumber
4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': Untuk mengembalikan nomor digit SAJA .
AechoLiu
sumber
3
wc -l file.txt | cut -f3 -d" "

Hanya mengembalikan jumlah garis

Umur Kontacı
sumber
3

Redirection / Piping output file ke wc -lcukup, seperti berikut:

cat /etc/fstab | wc -l

yang kemudian akan memberikan no. hanya garis.

tk3000
sumber
3

Atau hitung semua baris dalam subdirektori dengan pola nama file (mis. File log dengan cap waktu dalam nama file):

wc -l ./**/*_SuccessLog.csv
jwebuser
sumber
2

Saya tahu ini sudah tua tapi tetap saja: Hitung garis yang difilter

File saya terlihat seperti:

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

Jika saya ingin tahu berapa banyak file yang dikirim OK:

grep "OK" <filename> | wc -l

ATAU

grep -c "OK" filename
Diego Fernando Villarroel Diaz
sumber
2

hitung jumlah baris dan simpan hasil dalam variabel menggunakan perintah ini:

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

Konstantin F
sumber
1

Seperti yang orang lain katakan wc -ladalah solusi terbaik, tetapi untuk referensi di masa mendatang Anda dapat menggunakan Perl:

perl -lne 'END { print $. }'

$.berisi nomor baris dan ENDblok akan dieksekusi di akhir skrip.

Majid Azimi
sumber
1
Tidak berfungsi:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW
1
@VeikkoW Bekerja untuk saya. Jika Anda menggunakan Windows, aturan penawaran yang berbeda berlaku; tetapi OP bertanya tentang Linux / Bash.
tripleee
1
perl -lne '}{ print $. 'melakukan hal yang sama.
Tom Fenech
1

Saya baru saja membuat program untuk melakukan ini (dengan node)

npm install gimme-lines
gimme-lines verbose --exclude=node_modules,public,vendor --exclude_extensions=html

https://github.com/danschumann/gimme-lines/tree/master

Funkodebat
sumber
4
Bukankah itu seperti menggunakan F16 untuk membunuh gulma kebun?
Buttle Butkus
1

wc -l <filename>

Ini akan memberi Anda jumlah baris dan nama file dalam output.

Misalnya.

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

Keluaran

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

Menggunakan

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

untuk mendapatkan hanya jumlah baris dalam output.

Misalnya.

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

Keluaran

63

Harsh Sarohi
sumber
Di mana manfaat mengulangi jawaban yang diterima (sepuluh tahun)?
jeb
Karena saya tidak dapat menemukan perintah untuk mendapatkan hanya nomor baris dalam output di utas ini.
Harsh Sarohi
Ini adalah contoh kedua dalam jawaban yang diterima. wc -l < filename
jeb
wc -l <nama file> memberikan nama file serta jumlah baris dalam output.
Harsh Sarohi
Tidak, wc -l < filenameberbeda dengan wc -l filename, yang pertama menggunakan pengalihan dan kemudian tidak ada nama file dalam output, seperti yang ditunjukkan dalam jawaban dari user85509
jeb
1

Fungsi shell portabel drop-in ini [ℹ]   bekerja seperti pesona. Cukup tambahkan cuplikan berikut ke .bashrcfile Anda (atau setara dengan lingkungan shell Anda) .

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

Ini harus sepenuhnya kompatibel dengan semua shell yang mendukung POSIX selain bash dan zsh .

blizzrdof77
sumber