awk
Çıktıyı tersten işleyerek işleri basitleştiren bir çözüm ( tac
GNU çekirdeklerinin bir parçası olan komutu gerektirir ):
İlk önce, awk
script ('process.awk' gibi bir dosyaya yerleştirin). Bir bash
liner için sadece biraz fazla uzun .
BEGIN { output=0; any=0; }
/^Test .* FAILED/ { output=1; any=1; }
/^Test .* PASSED/ { output=0; }
/^Start test group/ && any == 1 { output=1; any=0; }
output == 1 { print; }
Ardından, ters çevrilmiş günlük dosyasında bu betiği çalıştırın ve çıktıyı ters çevirin:
tac logfile | awk -f process.awk | tac
O nasıl çalışır?
Öncelikle tac
satırların sırasını tersine çevirmek için girdilerimizden geçiyoruz (böylece "takip eden" satırların okumadan önce BAŞARILI veya GEÇİŞİ testine ait olup olmadığını belirleyebiliriz).
Komut aşağıdaki gibi çalışır. Her eylem, eşleşmesi gereken bir koşuldan sonra geçerli satır koşulla eşleşiyorsa yürütülecek kod bloğundan oluşur.
İlk eylem, girdiye bakmaya başlamadan önce her zaman bir kez yürütülen bir BEGIN işlemidir. Basılı olanı kontrol eden iki boolean bayrağı başlattı. output
Mevcut satırı yazdırmak istiyorsak 1 olarak, aksi takdirde 0 olarak ayarlanacaktır. any
HIZLI bir testle karşılaştığımız her zaman 1 olarak ayarlanacak ve bir test grubunu işlemeyi bitirdikten sonra 0 olarak sıfırlanacaktır. Her iki değer de 0'dan başlar.
Bir sonraki eylem, başarısız bir testin başlangıcı olup olmadığını görmek için geçerli satırı test eder (unutmayın, çıktıyı tersine işliyoruz). Eğer öyleyse, hem set output
ve any
.
Bir sonraki eylem, geçilen bir testin başlangıcı olup olmadığını görmek için geçerli satırı test eder. Eğer öyleyse, output
bayrağı temizleyin , ancak any
yalnız bırakın . (Test grubunun bitiminden önce hala başarısız bir test olabilir).
Sonraki eylem, test grubu başlığı olup olmadığını ve any
bayrağın ayarlanıp ayarlanmadığını görmek için geçerli satırı test eder . Eğer öyleyse, başlığı yazdırmak istiyoruz (en az bir başarısız testimiz vardı), bu yüzden ayarlayın output
ve temizleyin any
(bir sonraki test grubuna hazırlanmak için). Aksi takdirde, hiçbir şey yapmamız gerekmez; any
Zaten 0'dır ve output
ayarlanmış olamaz 1
eğer any
olmadı.
Son olarak, şu anki çizgiye bakmayan bir eylemimiz var, ancak önceki eylemlerden herhangi birinin ayarlanmış olup olmadığını kontrol ediyoruz output
. Varsa, şu anki satırı basarız (bu bir "Test Başarısız" satırı, "FAILED" satırından önce gelen bazı ayrıntılı bilgiler veya bir test grubu başlığı).
Tüm işlemler bittikten sonra, bir sonraki giriş satırına geçer ve her işlemi tekrar uygulamaya çalışırız. Tüm girdiler tükendikten sonra, istediğimiz her çıktı satırını ancak ters sırada yazdırırız. Çıkışı borulara bağlar, tac
bunu düzeltir.
Senaryoyu daha karmaşık hale getirme pahasına biraz daha verimli yapılabileceğini, ancak yeterince hızlı olması gerektiğini unutmayın.
tac
daha kolay ayrıştırma için güzel bir numara .