2017-01-27 64 views

cevap

6

string1 veya string2 için arama yapmak istediğinizde /string1|string2 kullanın. Eğer doğrultusunda sırasını biliyoruz ve tam bir çizgi görmek istemediğinizde

/string1.*string2 

, sen

/.*string1.*string2.*|.*string2.*string1.* 

Veya daha kısa

gerekecektir: Sen hem nerede bulabileceğimi hatları istediğini söyledi
/.*(string1.*string2|string2.*string1).* 

Sabit bir sıra olmadan daha fazla sözcük birleştirmek karmaşaya dönüşür ve ilk olarak awk ile filtrelemek güzeldir.

+0

Teşekkürler! Benim için çalıştı. Şahsen, "dosya açıksa, arama dizesini hızlı bir şekilde değiştirebilirim, geçerli konumdan ileriye/geriye doğru arama yapabilmem" nedeniyle awk'den daha az tercih ederim. Birden fazla dizeyi daha az ile arama yeteneği bir bonus. – Satish

+0

Bunu tercih edersiniz çünkü bu cevap sadece iki * arama modelini ele alır. Desen sayısını arttırdığınızda ya da desenler daha karmaşık olduğunda, bu durum çok karmaşıktır. * Üç * desen yazmanın neredeyse imkansızdır. – hek2mgl

+0

@ hek2mgl katılıyorum, benim durumumda arama dizgileri sırası biliniyor ve sadece 2 veya 3 arama dizgisi max var, bu yüzden tercih etti. Aksi halde daha azıyla awk önerdiğin gibi gitmek için yoldur. – Satish

3

Kullanım awk filtrelenmiş Sonucu görmek için dosya ve less filtrelemek için: Dosya büyükse

awk '/pattern1/ && /pattern2/ && /pattern3/' file.log | less 

Eğer less önceki sonuçları görmek için stdbuf kullanmak isteyebilirsiniz:

stdbuf awk '/pattern1/ && /pattern2/ && /pattern3/' file.log | less