見つかった行の前後の行も表示する grep

見つかった行に加え前後の行も出力する grep
実行結果(アスタリスク '*' のあるところが見つかった行)
D:\work\MultiGrep.ps1(1):*: Param( [IO.DirectoryInfo] $path, [String] $filter, $sMatch, $before, $after )
D:\work\MultiGrep.ps1(2): :
D:\work\MultiGrep.ps1(3): : if( $path -eq $Null )
D:\work\MultiGrep.ps1(4): : {
D:\work\MultiGrep.ps1(4): : {
D:\work\MultiGrep.ps1(5): : "grep です。見つかった行の前後の行も表示する`n"
D:\work\MultiGrep.ps1(6): : "書式"
D:\work\MultiGrep.ps1(7):*: "MultiGrep <フォルダ・パス> <filter> <検索値> [before] [after]`n"
D:\work\MultiGrep.ps1(8): : "フォルダ・パス フルパスで指定する"
D:\work\MultiGrep.ps1(9): : "filter grep 対象のファイルをしぼる。ワイルドカード可"
D:\work\MultiGrep.ps1(10): : "検索値 見つける文字列"
D:\work\MultiGrep.ps1(9): : "filter grep 対象のファイルをしぼる。ワイルドカード可"
D:\work\MultiGrep.ps1(10): : "検索値 見つける文字列"
D:\work\MultiGrep.ps1(11): : "before 見つかった行の直前も表示する場合に 1 以上を指定する"
D:\work\MultiGrep.ps1(12):*: "after 見つかった行の直後も表示する場合に 1 以上を指定する"
D:\work\MultiGrep.ps1(13): : "`n例"
D:\work\MultiGrep.ps1(14): : "MultiGrep C:\Windows *.ps1,*.txt line"
D:\work\MultiGrep.ps1(15): : "MultiGrep C:\Windows @('*.ps1';'*.txt') line"
D:\work\MultiGrep.ps1(14): : "MultiGrep C:\Windows *.ps1,*.txt line"
D:\work\MultiGrep.ps1(15): : "MultiGrep C:\Windows @('*.ps1';'*.txt') line"
D:\work\MultiGrep.ps1(16): : "MultiGrep C:\Windows *.txt line 3 3"
D:\work\MultiGrep.ps1(17):*: "MultiGrep C:\Windows *.txt line -after 3"
D:\work\MultiGrep.ps1(18): : ""
D:\work\MultiGrep.ps1(19): : return
D:\work\MultiGrep.ps1(20): : }
D:\work\MultiGrep.ps1(52): :
D:\work\MultiGrep.ps1(53): :
D:\work\MultiGrep.ps1(54): : $nRetBefore = LineNo $before 'before'
D:\work\MultiGrep.ps1(55):*: $nRetAfter = LineNo $after 'after'
D:\work\MultiGrep.ps1(56): :
D:\work\MultiGrep.ps1(57): : if( ($nRetBefore -lt 0) -bor ($nRetAfter -lt 0) )
D:\work\MultiGrep.ps1(58): : {
D:\work\MultiGrep.ps1(54): : $nRetBefore = LineNo $before 'before'
D:\work\MultiGrep.ps1(55): : $nRetAfter = LineNo $after 'after'
D:\work\MultiGrep.ps1(56): :
D:\work\MultiGrep.ps1(57):*: if( ($nRetBefore -lt 0) -bor ($nRetAfter -lt 0) )
D:\work\MultiGrep.ps1(58): : {
D:\work\MultiGrep.ps1(59): : return
D:\work\MultiGrep.ps1(60): : }
D:\work\MultiGrep.ps1(64): : $before = 0
D:\work\MultiGrep.ps1(65): : }
D:\work\MultiGrep.ps1(66): :
D:\work\MultiGrep.ps1(67):*: if( $nRetAfter -ne 0 )
D:\work\MultiGrep.ps1(68): : {
D:\work\MultiGrep.ps1(69): : $after = 0
D:\work\MultiGrep.ps1(70): : }
D:\work\MultiGrep.ps1(66): :
D:\work\MultiGrep.ps1(67): : if( $nRetAfter -ne 0 )
D:\work\MultiGrep.ps1(68): : {
D:\work\MultiGrep.ps1(69):*: $after = 0
D:\work\MultiGrep.ps1(70): : }
D:\work\MultiGrep.ps1(71): :
D:\work\MultiGrep.ps1(72): :
D:\work\MultiGrep.ps1(94): : {
D:\work\MultiGrep.ps1(95): : if( $_ -match $sMatch )
D:\work\MultiGrep.ps1(96): : {
D:\work\MultiGrep.ps1(97):*: if( ($before -gt 0) -bor ($after -gt 0) )
D:\work\MultiGrep.ps1(98): : {
D:\work\MultiGrep.ps1(99): : ""
D:\work\MultiGrep.ps1(100): : }
D:\work\MultiGrep.ps1(118): :
D:\work\MultiGrep.ps1(119): : $n = $resource.lineIndex + 1
D:\work\MultiGrep.ps1(120): :
D:\work\MultiGrep.ps1(121):*: for( $i = 0; $i -lt $after; $i ++ )
D:\work\MultiGrep.ps1(122): : {
D:\work\MultiGrep.ps1(123): : if( $n -lt $lines.Length )
D:\work\MultiGrep.ps1(124): : {
実行(MultiGrep.ps1 を grep する)
.\MultiGrep D:\work MultiGrep.ps1 after 3 3
MultiGrep.ps1
Param( [IO.DirectoryInfo] $path, [String] $filter, $sMatch, $before, $after )
if( $path -eq $Null )
{
"grep です。見つかった行の前後の行も表示する`n"
"書式"
"MultiGrep <フォルダ・パス> <filter> [before] [after]`n"
"フォルダ・パス  フルパスで指定する"
"filter          grep 対象のファイルをしぼる。ワイルドカード可"
"before          見つかった行の直前も表示する場合に 1 以上を指定する"
"after           見つかった行の直後も表示する場合に 1 以上を指定する"
"`n例"
"MultiGrep C:\Windows *.ps1,*.txt"
"MultiGrep C:\Windows @('*.ps1';'*.txt')"
"MultiGrep C:\Windows *.txt 3 3"
"MultiGrep C:\Windows *.txt -after 3"
""
return
}
if( (Test-Path $path) -eq $False )
{
"指定されたファイルが見つかりません`n"
return
}
Function LineNo( $line, $sParamName )
{
if( $line -eq $Null )
{
return 1
}
if( $line.GetType() -ne [System.Int32] )
{
Write-Host ("{0} : 整数を指定して" -f $sParamName)
return -1
}
if( $line -lt 0 )
{
Write-Host ("{0} : 0 以上を指定して" -f $sParamName)
return -2
}
return 0
}
$nRetBefore = LineNo $before 'before'
$nRetAfter = LineNo $after 'after'
if( ($nRetBefore -lt 0) -bor ($nRetAfter -lt 0) )
{
return
}
if( $nRetBefore -ne 0 )
{
$before = 0
}
if( $nRetAfter -ne 0 )
{
$after = 0
}
Function MultiGrep
{
Param( $fileName, $lines )
Begin
{
$resource = @{ lineIndex = 0 }
$resource.fn = `
{
Param( $ch, $lineNumber, $text )
"{0}({1}){2} {3}" -f $fileName, ($lineNumber + 1), $ch, $text
}.GetNewClosure()
}
End
{
}
Process
{
if( $_.IndexOf($sMatch) -ge 0 )
{
if( ($before -gt 0) -bor ($after -gt 0) )
{
""
}
$n = $resource.lineIndex - $before
for( $i = 0; $i -lt $before; $i ++ )
{
if( $n -ge 0 )
{
& $resource.fn ': :' $n $lines[$n]
}
$n ++
}
& $resource.fn ':*:' $resource.lineIndex $_
$n = $resource.lineIndex + 1
for( $i = 0; $i -lt $after; $i ++ )
{
if( $n -lt $lines.Length )
{
& $resource.fn ': :' $n $lines[$n]
}
$n ++
}
}
$resource.lineIndex ++
}
}
Get-ChildItem -Path:($path.FullName + '\*') -Include:$filter -Recurse | &`
{
Process
{
$lines = Get-Content -LiteralPath:$_.FullName
$lines | MultiGrep $_.FullName $lines
}
}