Saya mencoba mencari file log untuk aktivitas log yang tidak lengkap. Misalnya, saya mencatat "Aktivitas awal untuk ID 1234 ..." dan jika berhasil, baris berikutnya adalah "Aktivitas 1234 Selesai."
Saya mencoba mendapatkan garis "Mulai ..." yang TIDAK diikuti oleh garis "Selesai" yang sesuai.
Contoh File Log
Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully
Dalam contoh ini, saya akan mencari output menjadi:
Starting activity for ID 33367
... karena tidak diikuti oleh garis "selesai".
Saya sudah mencoba melakukan ini dengan grep
dan awk
, tetapi belum banyak berhasil. Saya berasumsi itu bisa dilakukan dengan salah satu alat itu, tetapi saya grep
dan awk
daging tidak maju.
Mencari pola grep
atau cepat dan dapat diandalkan awk
untuk memberikan hasil yang saya butuhkan di sini.
Jawaban:
Berikut ini sebuah
awk
alternatif:Keluaran:
The
I
array asosiatif melacak apa id telah terlihat.sumber
I[$5] = 1
, Anda bisa menggunakannyaI[$5]
. (Anda tidak peduli dengan nilainya, Anda hanya ingin membuat elemen itu ada , dan cukup menamainya.)Ini akan menghapus dari output semua jalur input yang tidak diikuti oleh garis yang cocok dengan string yang selesai .
sumber
Inilah cara Anda dapat melakukannya dengan sed GNU:
N
membaca satu baris lagi ke dalam ruang pola.d
) dan siklus dimulai kembali.P
) dan hapus (D
).sumber
-r
tidak diperlukan, kan?+
kuantifier.jika instalasi Anda mendukung pcregrep, opsi multiline (-M) sangat berguna.
Mulai aktivitas untuk ID 33367
sumber