2013-02-11 12 views
12

Riddle me:Powershell: filtruj zawartość pliku przez tablicę ciągów znaków

Mam plik tekstowy danych. Chcę go odczytać i wyprowadzać tylko linie zawierające dowolny ciąg znaleziony w tablicy wyszukiwanych terminów.

Jeśli ja szukaliśmy jednym ciągiem, chciałbym zrobić coś takiego:

get-content afile | where { $_.Contains("TextI'mLookingFor") } | out-file FilteredContent.txt 

Teraz wystarczy dla „TextI'mLookingFor”, aby być tablicą stringów, gdzie jeśli $ _ zawiera dowolny ciąg w tablicy, jest przekazywany w dół do potoku do pliku zewnętrznego.

Jak miałbym to zrobić (a tak przy okazji, jestem programista C# hacking skryptu powershell, więc jeśli istnieje lepszy sposób na mój mecz wyżej niż przy użyciu .Contains(), clue mnie!)

Odpowiedz

26

Wypróbuj Select-String. Pozwala na szereg wzorów. Ex:

$p = @("this","is","a test") 
Get-Content '.\New Text Document.txt' | Select-String -Pattern $p -SimpleMatch | Set-Content FilteredContent.txt 

Zauważ, że używam -SimpleMatch tak że Select-String ignoruje znaki specjalne regex-. Jeśli chcesz wypróbować w swoich wzorach, po prostu to usuń.

przypadku pojedynczego wzoru I prawdopodobnie wykorzystać to, ale trzeba uciec znaki regex w schemacie:

Get-Content '.\New Text Document.txt' | ? { $_ -match "a test" } 

Select-String jest doskonałym cmdlet dla pojedynczych wzorców też, że to tylko kilka znaków już pisać ^^

2

Każda pomoc?

$a_Search = @(
    "TextI'mLookingFor", 
    "OtherTextI'mLookingFor", 
    "MoreTextI'mLookingFor" 
    ) 


[regex] $a_regex = ‘(‘ + (($a_Search |foreach {[regex]::escape($_)}) –join “|”) + ‘)’ 

(get-content afile) -match $a_regex 
+0

Wybierz ciąg jest prawdopodobnie lepszym wyborem, zwłaszcza dla danych plików. – mjolinor

+0

Po prostu uruchomiłem szybki test, a -match działa lepiej dla dużej liczby powtórzeń (około 15 razy szybciej niż łańcuch wyboru). – mjolinor

+0

Dzięki za zmianę wyrażeń +1. Podałem odpowiedź na odpowiedź łańcuchową ze względu na prostotę. – JMarsch

1
$a = @("foo","bar","baz") 
findstr ($a -join " ") afile > FilteredContent.txt 
2

bez regex ze spacjami możliwe:

$array = @("foo", "bar", "hello world") 
get-content afile | where { foreach($item in $array) { $_.contains($item) } } > FilteredContent.txt 
Powiązane problemy