sed
pendekatan baik-baik saja, tetapi untuk mengulang semua baris tidak. Jika Anda tahu berapa banyak baris yang ingin Anda pertahankan (sebagai 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 -i
diberikan, itu memproses file secara langsung ("inline") - bukan hanya membaca dan menulis hasilnya ke output standar. 100,$
hanya berarti "dari baris 100 ke akhir file" -- dan diikuti dengan perintah d
, yang mungkin Anda duga dengan benar adalah singkatan dari "delete". Jadi singkatnya, perintahnya berarti:"Hapus semua baris dari baris 100 hingga akhir file dari myfile.txt". 100 adalah baris pertama yang akan dihapus, karena Anda ingin menyimpan 99 baris.
Edit: Sebaliknya, jika ada file log yang ingin Anda simpan, mis. terakhir 100 baris:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
Apa yang terjadi di sini:
[ $(wc -l myfile.txt) -gt 100 ]
:lakukan hal 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 100 (terakhir) yang akan disimpan)1, $((..)) d
:hapus semua baris dari baris pertama hingga baris yang dihitung
EDIT: karena pertanyaannya baru saja diedit untuk memberikan detail lebih lanjut, saya juga akan menyertakan informasi tambahan ini dengan jawaban saya. Fakta tambahan adalah:
- ukuran tertentu akan tetap bersama file (10.000 byte)
- setiap baris memiliki ukuran tertentu dalam byte (300 byte dalam contoh)
Dari data ini dimungkinkan untuk menghitung jumlah baris yang tersisa sebagai " / ", yang dengan contoh berarti 33 baris. Istilah shell untuk perhitungan:$((size_to_remain / linesize))
(setidaknya di Linux menggunakan Bash, hasilnya adalah bilangan bulat). 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 sudah diketahui sebelumnya, tidak perlu lagi perhitungan yang disematkan ke sed
memerintah. Tetapi untuk fleksibilitas, di dalam beberapa skrip shell seseorang dapat menggunakan variabel.
Untuk pemrosesan bersyarat berdasarkan ukuran file, seseorang dapat menggunakan "test"-construct berikut:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
yang artinya:"jika ukuran $file
melebihi 100kB, lakukan..." (ls -lk
mencantumkan ukuran file dalam kB pada posisi 5, maka awk
digunakan untuk mengekstrak persis ini).