Ich habe eine mehrzeilige Zeichenfolge wie die folgende:
2012-15-08 07:04 Bla bla bla blup
2012-15-08 07:05 *** Error importing row no. 5: The import of this line failed because bla bla
2012-15-08 07:05 Another text that I don't want to search...
2012-15-08 07:06 Another text that I don't want to search...
2012-15-08 07:06 *** Error importing row no. 5: The import of this line failed because bla bla
2012-15-08 07:07 Import has finished bla bla
Was ich möchte, ist, alle Zeilennummern, die Fehler enthalten, mit Hilfe von RegularExpression (mit PowerShell) zu extrahieren. Ich muss also die Nummer zwischen "*** Fehler beim Importieren der Zeilennummer" und dem folgenden ":" finden, da mir dies immer die Zeilennummer gibt.
Ich habe mir verschiedene andere RegEx-Fragen angesehen, aber um ehrlich zu sein, sind die Antworten für mich wie Chinesisch.
Ich habe versucht, RegEx mit Hilfe von http://regexr.com/ zu bauen, war aber bisher nicht erfolgreich, beispielsweise mit dem folgenden Muster:
"Error importing row no. "(.?)":"
Irgendwelche Hinweise?
Versuchen Sie diesen Ausdruck:
"Error importing row no\. (\d+):"
Hier müssen Sie die Quantifizierer und die verstrichenen Sequenzen verstehen:
.
beliebiges Zeichen; Wenn Sie nur Zahlen wünschen, verwenden Sie \d
; wenn Sie das Punktzeichen bedeuteten, müssen Sie es mit einem Backslash (\.
)?
Null oder ein Zeichen; das ist nicht was Sie wollen, da Sie hier einen Fehler in Zeile 10 haben können und nur die "1" nehmen würden+
Eins oder viele; das genügt uns*
Beliebige Zeichenanzahl; Sie müssen vorsichtig sein, wenn Sie dies mit .*
verwenden, da dies Ihre gesamte Eingabe verbrauchen kannZiemlich einfach. Jetzt wird Ihr Zitat einen Fehler in der Regex verursachen, die Sie geschrieben haben. Versuchen Sie es stattdessen:
$LogText = ""#Your logging stuff
[regex]$Regex = "Error importing row no\. ([0-9]*):"
$Matches = $Regex.Matches($LogText)
$Matches | ForEach-Object {
$RowNum = $_.Groups[1].Value #(Waves hand) These are the rows you are looking for
}
Es gibt mehrere Möglichkeiten, ein paar einfache Möglichkeiten könnten helfen: -
Ich habe Ihr Log in eine Datei namens temp.txt aufgenommen.
cat temp.txt | grep " Error importing row no." | awk -F":" '{print $2}' | awk -F"." '{print $2}'
OR
cat temp.txt | grep " Error importing row no." | sed 's/\(.*\)no.\(.*\):\(.*\)/\2/'