The sed
pendekatan baik-baik saja, tapi loop atas semua lini tidak. Jika Anda tahu berapa banyak baris yang ingin Anda pertahankan (untuk memiliki contoh, saya menggunakan 99 di sini), Anda dapat melakukannya seperti ini:
sed -i '100,$ d' myfile.txt
Penjelasan: sed
adalah prosesor ekspresi reguler. Dengan opsi yang -i
diberikan, ia memproses file secara langsung ("inline") - alih-alih hanya membacanya dan menulis hasilnya ke output standar. 100,$
hanya berarti "dari baris 100 hingga akhir file" - dan diikuti oleh perintah d
, yang mungkin Anda tebak dengan benar artinya "hapus". Jadi singkatnya, perintah itu berarti: "Hapus semua baris dari baris 100 ke akhir file dari myfile.txt". 100 adalah baris pertama yang akan dihapus, karena Anda ingin mempertahankan 99 baris.
Sunting: Jika, di sisi lain, ada file log tempat Anda ingin menyimpan mis. 100 baris terakhir :
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
Apa yang terjadi disini:
[ $(wc -l myfile.txt) -gt 100 ]
: lakukan langkah-langkah berikut hanya jika file memiliki lebih dari 100 baris
$((100 - $(wc -l myfile.txt|awk '{print $1}')))
: menghitung jumlah baris yang akan dihapus (yaitu semua baris file kecuali (terakhir) yang dipertahankan 100)
1, $((..)) d
: hapus semua baris dari baris pertama hingga baris yang dihitung
EDIT: karena pertanyaannya baru saja diedit untuk memberikan rincian lebih lanjut, saya akan memasukkan informasi tambahan ini dengan jawaban saya juga. Fakta yang ditambahkan adalah:
- ukuran tertentu harus tetap dengan file (10.000 byte)
- setiap baris memiliki ukuran spesifik dalam byte (300 byte dalam contoh)
Dari data ini dimungkinkan untuk menghitung jumlah baris untuk tetap sebagai "/", yang dengan contoh berarti 33 baris. Istilah shell untuk perhitungan: $((size_to_remain / linesize))
(setidaknya di Linux menggunakan Bash, hasilnya adalah integer). Perintah yang disesuaikan sekarang akan berbunyi:
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
Karena ukuran diketahui sebelumnya, tidak ada lagi kebutuhan untuk perhitungan yang melekat pada sed
perintah. Tetapi untuk fleksibilitas, di dalam beberapa skrip shell kita dapat menggunakan variabel.
Untuk pemrosesan bersyarat berdasarkan ukuran file, seseorang dapat menggunakan "test" berikut ini:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
yang berarti: "jika ukurannya $file
melebihi 100kB, lakukan ..." ( ls -lk
daftar ukuran file dalam kB pada posisi 5, maka awk
digunakan untuk mengekstrak persis ini).