PowerShell: satırı bul, ancak ilerleyen ve bir önceki satırları da dahil et


-2

Bu, sadece kafamdan kısaca düşündüğüm kavramsal bir sorudur. Nasıl yapabileceğime dair bir fikrim var, ancak yapabileceğimi düşündüğümden daha karmaşık görünüyor.

Yaygın bir ihtiyaç, bir dosyayı aramaktır (örneğin bir hata günlüğü olabilir) ve bu dosyayı belirli bir dize değeri aramak istiyorum. Ancak benim durumumda, bazı uygulamaların bir satırda hata çıktığını düşündüm, ancak hata metnini içeren satır o günlüğün ilerleyen satırında ya da önceki satırda olabilir (örneğin, SQL Server hata günlükleri). Dolayısıyla bu durumda, aramada sağlanan belirli bir dizeyle bulunan çizgiyi dahil etmek isteyebilirim, ancak ondan önce ve sonra çizgiyi (veya hatta çizgileri) dahil etmek isteyebilirim.

Senaryolarımı kullanabilecek veya bulabilecek başkalarının okunabilirliği için elimden geldiğince basit tutmaya çalışıyorum. Kafamda bunun kolay yazılmış olacağını düşünemiyorum.

DÜZENLE

Select-StringBunu kullanarak verilen cevaba dayanarak yapmaya çalıştığım bir örnek:

[void][System.Reflection.Assembly]::[LoadWithPartialName]('Microsoft.SqlServer.SMO')
$s = New-Object Microsoft.SqlServer.Management.Smo.Server MyServer
$s.EnumErrorLogs() | select -ExpandProperty Name | 
foreach { $s.ReadErrorLog($_) | select-string -Pattern "*Serverity: 25*" -Context 3 -SimpleMatch | 
select LogDate, ProcessInfo, Text

Kendi sorumu tekrar okuduğumda, biraz zayıfım ... Hatta kendim bile oylardım.
Shawn Melton

"Önem Derecesi" ni doğru hecelemeniz yardımcı olabilir ... Sadece söylüyorum. :)
Tim Ferrill

Yanıtlar:


4

Select-Stringİle cmdlet'in -Contexthemen hemen ... Bu dosyanın içeriğini okumak ve üstünde ve dize altında 3 satırları döndüren bir dize arar yapmaya çalıştığınız şey için mükemmel bir eştir:

$file = C:\Users\Public\Documents\log.txt
$string = "*error*"
Get-Content $file | Select-String $string -Context 3 -SimpleMatch

Varsayılan olarak Select-Stringnormal ifadeler kullanır, ancak -SimpleMatchdüz metin araması yapar.


Aslında bu SQL Server hata günlükleri okuma ile ilgili çalışacak alamıyorum. Onları SMO aracılığıyla okuyorum, bu yüzden onu etkileyip etkilemediğini bilmeyeceklerini bilmiyorum.
Shawn Melton

Select-String, nesne niteliklerini değil bitişik bir dizeyi arıyor. İstediğiniz sonucu elde etmek için her satırı bir dizgeye dönüştürmeniz ve ardından sütunlara geri dönmeniz gerekebilir. Ayrıca ... Eğer SMO alıyoruz çıktı bazılarını olabilir
Tim Ferrill

Bu fonksiyonu mümkün olduğunca basit tutmaya çalıştığımdan çok daha fazla sorun gibi geliyor. Beklediğim gibi, nesne özelliği konusunda haklısınız, sanırım bu işlevi eklemeyi denemeye devam edeceğim.
Shawn Melton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.