Skip to main content

PowerShell: Grep Alternative

Set Recurse = $false when required (e.g. an extensive amount of subdirectories or files).

$searchString = 'P@$$word123!'
$gciParams = @{
  Path = '.\config'
  Recurse = $true
  File = $true
  Filter = '*.conf'
}
Get-ChildItem @gciParams | 
ForEach-Object { 
  $file = $_
  $match = cat $file.FullName | Select-String $searchString
  $match | ForEach-Object { 
    $relativeFileName = $file.FullName -replace [regex]::escape($pwd)
    $matchString = $_.ToString()
    $lineNumber = $((cat $file.FullName).IndexOf($matchString) + 1)
    $fileLineString = ".$relativeFileName`:$lineNumber"
    Write-Output "$fileLineString`:$matchString" 
  } 
}

Or, as a one-liner...

$searchString = 'P@$$word123!' ; $gciParams = @{ Path = '.\config' ; Recurse = $true ; File = $true ;  Filter = '*.conf' } ; Get-ChildItem @gciParams | ForEach-Object { $file = $_ ; $match = cat $file.FullName | Select-String $searchString ; $match | ForEach-Object { $relativeFileName = $file.FullName -replace [regex]::escape($pwd) ; $matchString = $_.ToString() ; $lineNumber = $((cat $file.FullName).IndexOf($matchString) + 1) ; $fileLineString = ".$relativeFileName`:$lineNumber" ; Write-Output "$fileLineString`:$matchString" } }