Jika saya ingin tail
filefile 25 GB, apakah tail
perintah membaca seluruh file?
Karena file mungkin tersebar di disk saya bayangkan itu harus, tetapi saya tidak mengerti internal seperti itu dengan baik.
Tidak, tail
tidak membaca keseluruhan file, ia mencari sampai akhir lalu membaca blok ke belakang sampai jumlah garis yang diharapkan telah tercapai, kemudian menampilkan garis dalam arah yang benar sampai akhir file, dan mungkin tetap memantau file jika -f
opsi digunakan.
Namun perhatikan bahwa tail
tidak ada pilihan selain membaca seluruh data jika memberikan input yang tidak dapat dicari, misalnya saat membaca dari sebuah pipa.
Demikian pula, ketika diminta untuk mencari baris mulai dari awal file, dengan menggunakan tail -n +linenumber
sintaks atau tail +linenumber
opsi non-standar ketika didukung, tail
jelas membaca seluruh file (kecuali terganggu).
tail +n
akan membaca seluruh file - pertama untuk menemukan jumlah baris baru yang diinginkan, kemudian untuk mengeluarkan sisanya.tail
implementasi melakukannya atau melakukannya dengan benar. Misalnya busybox 1.21.1tail
rusak dalam hal itu. Perhatikan juga bahwa perilaku bervariasi ketika menggunakantail
stdin dan di mana stdin adalah file biasa dan posisi awal dalam file tidak di awal ketikatail
dipanggil (seperti di{ cat > /dev/null; tail; } < file
)Anda bisa melihat cara
tail
kerjanya sendiri. Yang Anda bisa untuk salah satu file sayaread
dilakukan tiga kali dan total sekitar 10K byte dibaca:sumber
strace
menunjukkan apa yangtail
dilakukan panggilan sistem saat dijalankan. Beberapa pengantar tentang panggilan sistem dapat Anda baca di sini en.wikipedia.org/wiki/System_call . Secara singkat - buka - membuka file dan mengembalikan pegangan (3 dalam contoh ini),lseek
posisi di mana Anda akan membaca danread
hanya membaca dan karena Anda dapat melihatnya mengembalikan berapa byte yang dibaca,Seperti yang Anda ketahui,
tail
hanya mencari ke akhir file (dengan panggilan sistemlseek
), dan bekerja mundur. Tetapi dalam komentar yang dikutip di atas, Anda bertanya-tanya "bagaimana ekor tahu di mana pada disk untuk menemukan akhir file?"Jawabannya sederhana: Ekor tidak tahu. Proses tingkat pengguna melihat file sebagai aliran kontinu, sehingga yang
tail
bisa diketahui adalah offset dari awal file. Tetapi dalam sistem file, "inode" file (entri direktori) dikaitkan dengan daftar angka yang menunjukkan lokasi fisik blok data file. Ketika Anda membaca dari file, kernel / driver perangkat mencari tahu bagian mana yang Anda butuhkan, menentukan lokasinya pada disk dan mengambilnya untuk Anda.Itulah jenis sistem operasi yang kami miliki: jadi Anda tidak perlu khawatir tentang di mana blok file Anda tersebar.
sumber
Jika
head
atautail
tampaknya membaca seluruh file, kemungkinan alasannya adalah bahwa file tersebut berisi sedikit atau tidak ada karakter baris baru . Saya tersandung ini beberapa bulan yang lalu dengan gumpalan JSON yang sangat besar (gigabytes) yang telah diserialkan tanpa spasi apa pun, bahkan dalam string.Jika Anda memiliki GNU head / tail yang dapat Anda gunakan
-c N
untuk mencetak byte pertama / terakhir alih-alih garis , tapi sayangnya ini bukan fitur POSIX.sumber
Seperti yang Anda lihat di baris kode sumber 525, Anda dapat melihat komentar untuk implementasi.
sumber