Saya memiliki teks file besar (hampir 3GB) - ini adalah file log. Saya ingin mendapatkan baris teks yang sesuai dengan rentang tanggal dari file ini, dari 13 Juli hingga 19 Juli. Format log saya adalah:
2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>
jadi setelah grep
/ sed
seharusnya output seperti ini:
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
Bagaimana saya bisa mendapatkan ini?
command-line
grep
sed
corey
sumber
sumber
Jawaban:
Dengan
grep
jika Anda tahu jumlah garis yang Anda inginkan, Anda dapat menggunakan opsi konteks-A
untuk mencetak garis setelah polaitu akan memberi Anda garis dengan 2013-07-13 dan 3 baris berikutnya
dengan
sed
Anda dapat menggunakan tanggal untuk membatasi seperti iniyang akan mencetak semua baris dari baris pertama dengan 2016-07-13 hingga dan termasuk baris pertama dengan 2016-07-19. Tapi itu mengasumsikan Anda hanya memiliki satu baris dengan 2016-07-19 (tidak akan mencetak baris berikutnya). Jika ada beberapa baris gunakan tanggal berikutnya dan gunakan
d
untuk menghapus output dari itusumber
Grep one liner sederhana ini sudah cukup:
Bekerja dengan baik di sini dan tidak perlu sed :)
Referensi:
sumber
^
untuk membuatnya berfungsi. Menggunakan Mac.awk
larutan:Pada dasarnya mencetak setiap baris dari yang dimulai dengan
2016-07-13
yang dimulai dengan2016-07-19
sumber
Semua jawaban saat ini bergantung pada fakta bahwa entri file log diurutkan secara kronologis atau fakta bahwa rentang tanggal dapat dicocokkan dengan mudah dengan ekspresi reguler. Jika Anda menginginkan solusi yang lebih umum, kita perlu melakukan beberapa pemrograman lagi.
Saya menyajikan skrip GNU AWK ini:
Anda memberikan waktu mulai dan berakhir melalui variabel
starttime
danendtime
dalam format yangmktime
memahami (YYYY MM DD hh dd ss
). Dengan demikian Anda menjalankanawk
perintah seperti itu, dengan asumsi bahwa skrip Awk di atas adalah dalam file yang dapat dieksekusifilter-log-dates.awk
di direktori kerja saat ini dan file log adalahmylog.txt
:Perhatikan bahwa waktu akhir bersifat eksklusif , yaitu catatan log yang valid harus memiliki stempel waktu sebelum waktu berakhir.
Jika format cap waktu Anda berbeda, Anda dapat menyesuaikan ekspresi reguler yang dilewatkan ke
match
fungsi yang sesuai dengannya.sumber
Anda bisa melakukannya dalam langkah-langkah. Temukan jumlah baris pertama yang cocok dengan pola awal Anda. Temukan jumlah baris terakhir yang cocok dengan pola akhir Anda. Kemudian ekstrak tes di antara dua baris ini. Hal ini dapat dilakukan sebagai berikut.
Ini bisa dilakukan semua dalam sebuah
awk
perintah tetapi langkah-langkahnya mungkin membuatnya lebih mudah untuk diikuti. Dalam awk, variabel NR adalah nomor baris saat ini, dan karena tidak ada tindakan yang ditentukan setelah pola (NR> = 1234 && NR <= 5678) tindakan default adalah mencetak garis-garis yang berada dalam kisaran itu.sumber