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?


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

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 ...


Anehnya kadang-kadang grep -cbekerja lebih baik untuk saya. Terutama karena wc -l"fitur" padding awalan ruang yang mengganggu.
MarkHu


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

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).


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 {} +


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

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.


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.


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.


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;)


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

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': Untuk mengembalikan nomor digit SAJA .


3

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

cat /etc/fstab | wc -l

yang kemudian akan memberikan no. hanya garis.


3

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

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

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

2

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

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


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.


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

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


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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.