(5 jawaban)
Tutup 2 tahun lalu.
Saya memiliki file yang berisi beberapa kemunculan pola “====” . Pola-pola ini diikuti oleh teks. Saya ingin mencari kemunculan terakhir “====” pola dan cetak semua garis setelah pola. Adakah ide tentang bagaimana melakukannya di bash? Kombinasi grep
, awk
, sed
atau tail
, dll..?
Contoh berkas:
====
First run of script
End of first Script
====
2nd run of script
End of 2nd script
====
3rd run of script
End of 3rd script
Output dari perintah akan terlihat seperti di bawah ini.
3rd run of script
End of 3rd script
Jawaban yang Diterima:
Metode alat perangkat lunak, lebih efisien untuk file besar karena hanya membaca akhir file, lalu berhenti ketika menemukan kecocokan terakhir:
tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac
Catatan:tambah atau kurangi 999999
sesuai kebutuhan, hanya agar lebih lama dari kecocokan apa pun yang memungkinkan. Kode ini akan berfungsi paling baik jika diketahui sebelumnya bahwa kecocokan terakhir diketahui berada di dekat akhir file besar. Lihat juga Glenn Jackman jawaban dengan varian untuk awk
dan sed
yang menghindari kebutuhan untuk 999999
. Untuk sistem dengan sumber daya yang sangat rendah, grep
lebih efisien daripada awk
atau sed
.
Untuk menghindari menebak, beberapa menambahkan stat
keburukan akan berhasil:
f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac