awkÇıktıyı tersten işleyerek işleri basitleştiren bir çözüm ( tacGNU çekirdeklerinin bir parçası olan komutu gerektirir ):
İlk önce, awkscript ('process.awk' gibi bir dosyaya yerleştirin). Bir bashliner 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 tacsatı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ı. outputMevcut satırı yazdırmak istiyorsak 1 olarak, aksi takdirde 0 olarak ayarlanacaktır. anyHIZLI 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 outputve 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, outputbayrağı temizleyin , ancak anyyalnı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 anybayrağı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 outputve temizleyin any(bir sonraki test grubuna hazırlanmak için). Aksi takdirde, hiçbir şey yapmamız gerekmez; anyZaten 0'dır ve outputayarlanmış olamaz 1eğer anyolmadı.
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, tacbunu 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.
tacdaha kolay ayrıştırma için güzel bir numara .