Examples: # (special note: normally, the powershell escape character is `, but in # regexps it's \, except if what you're trying to escape is a dollar sign; # then '\$' doesn't work and the escape sequence is '[$]'.) # grep "searchstring" filename.txt select-string filename.txt -pattern "searchstring" -caseSensitive | %{ $_.line } # grep -i "searchstring" filename.txt select-string filename.txt -pattern "searchstring" | %{ $_.line } # grep -in --with-filename "searchstring" filename.txt select-string filename.txt -pattern "searchstring" # cat filename.txt | grep -i "searchstring" # (showing that it works on piped input, and the screwey 'readcount' option # from get-content) gc -readcount 2048 .\filename.txt | select-string "searchstring" Some things that don't work: This is tempting, but doesn't work -- because "-readcontent" returns blocks of 2048 lines at a time (in this example), the matching will be whole blocks at a time and any match within the block will return the entire block (including many non-matching lines): gc -readcount 2048 .\bigfile.txt | where {$_ -match "searchstring"} I'm actually not sure why this works (and doesn't return non-matching garbage); I'd have thought it was the same as the above, but apparently not: gc -readcount 2048 .\bigfile.txt | ForEach-Object {$_ -match "searchstring"} This, however, doesn't work, and I'm not sure what it's actually doing: gc -readcount 2048 .\bigfile.txt | ForEach-Object { if ($_ -match "searchstring") { # do other stuff with $_ # -- this fails and seems to only operate on a few lines } }