有没有一种方法可以显示使用PowerShell满足条件的文本行

时间:2019-06-06 19:57:04

标签: powershell select-string

$data = Select-String -Path $selectedDirectory\$sqlFile -Pattern "GRANT" -Context 5,5

我想使用PowerShell读取.SQL文件,并且我们要确保在没有人工检查文件是否还可以的情况下,用户没有使用GRANT或DROP或DELETE。

我的1条线只在看GRANT,但我认为它没有用。

如果关键字在文件中,我想在屏幕上显示出部分文字,在屏幕上+/- 5行找到有问题的文字。

是否可以更改具有违规搜索条件的特定行的文本颜色(其他所有行将默认显示)

4 个答案:

答案 0 :(得分:3)

如果要在控制台上显示颜色,则需要使用Write-Host

$data = Select-String -Path $selectedDirectory\$sqlFile -Pattern "GRANT|DROP|DELETE" -Context 5,5
$data | Foreach-Object {
    $_.Context.Precontext
    Write-Host $_.Line -ForeGroundColor Cyan
    $_.Context.Postcontext
}

答案 1 :(得分:1)

我会试一试。

此功能获取文件,搜索那些关键字,然后打印+/- 5行。很简单,我确定您知道它是如何工作的以及如何对其进行修改。您可以找到matchinfo类的引用(由Select-String(here返回。

Function Get-SQLForbiddenWords ($sqlDataFile) {
    $data =  Select-String -Path $sqlDataFile -Pattern "GRANT|DROP|DELETE" 
    Foreach ( $line in $data) {
        $lineNumberS = $line.LineNumber - 5
        $lineNumberE = $line.LineNumber + 5
        echo ('Bad Command Detected: {0}' -f $line.line)
        (Get-Content $sqlDataFile)[$lineNumberS..$lineNumberE]
        echo "`n"
    }
}

这很有趣。输出:

Bad Command Detected: DROP
this is the sixth line 
GRANT
this is the seventh line
this is the eighth line
DROP
this is the ninth line 
this is the tenth linet
this is the eleventh line 
this is the twelfbthfbth line 

答案 2 :(得分:0)

对于初学者,"GRANT"应该用引号引起来来表示字符串。

如果您注意到,$line = Select-String -Pattern "Grant"将返回一个对象。

如果使用Get-Member查看对象的属性,则其中之一是LineNumber

如果您已经使用$data = Get-Content File.sql或类似方法读取了文件的内容,则将数据作为数组对象。现在,您可以根据需要使用该行号提取+/- 5行,如$data[50..60]。这将显示第50至60行的输出行。您可以轻松地用变量替换50和60。

enter image description here

答案 3 :(得分:0)

另一种方法是使用oss函数(= {"Dogs" < "cats")。

Out-String -Stream

以下内容可能会使它更具可读性。

Select-String "\b(GRANT|DROP|DELETE)\b" .\test.txt -Context 5 | oss | foreach { Write-Host $_ -ForegroundColor ("White","Cyan")[$_[0] -eq '>'] }