20

Riddle me this:

I have a text file of data. I want to read it in, and only output lines that contain any string that is found in an array of search terms.

If I were looking for just one string, I would do something like this:

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

Now, I just need for "TextI'mLookingFor" to be an array of strings, where if $_ contains any string in the array, it is passed down the pipe to out-file.

How would I do that (and BTW, I'm a c# programmer hacking this powershell script, so if there is a better way to do my match above than using .Contains(), clue me in!)

4 Answers 4

41

Try Select-String . It allows an array of patterns. Ex:

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

Notice that I use -SimpleMatch so that Select-String ignores special regex-characters. If you want regex in your patterns, just remove that.

For a single pattern I would probably use this, but you have to escape regex characters in the pattern:

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

Select-String is a great cmdlet for single patterns too, it's just a few characters longer to write ^^

Sign up to request clarification or add additional context in comments.

Comments

5

Any help?

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


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

(get-content afile) -match $a_regex 

4 Comments

Select string is probably a better choice, especially for file data.
Just ran a quick test, and -match works better for large numbers of reps (about 15x faster than select-string).
Thanks for the regex variation +1. I gave the answer to the select-string response because of the simplicity.
Unless I was doing it inside a very busy loop I would, too. :)
3

without regex and with spaces possible:

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

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.