【问题标题】:Powershell -how to remove line details from selectstring outputPowershell - 如何从选择字符串输出中删除行详细信息
【发布时间】:2017-06-24 04:01:03
【问题描述】:

我想使用 powershell 从日志文件中选择一个字符串“安装状态”。为此,我使用了命令 $status=selectstring -path $path -pattern "installstatus" 。这个 cmd 在开始时给出了输出 installstatus=success 和路径和日志时间以及行详细信息,我通过添加 |{$_. $status 中模式后的行}。我还想删除行详细信息。我怎样才能删除这些详细信息。我只希望显示模式。任何帮助都会得到帮助。谢谢。

这里是场景

$path="C:\Users\sumith\filename.log";
$status=select-string -path $path -pattern "Install_status"

输出是

C:\Users\sumith\filename.log:79:ISS_LOG [14:45:41]: INSTALL_STATUS:SUCCESS

如果我给了

$status=select-string -path $path -pattern "Install_status" | {$_.Line}

输出将是

ISS_LOG [14:45:41]: INSTALL_STATUS:SUCCESS

现在我想从输出中删除 ISS_LOG [14:45:41]:

【问题讨论】:

  • 请粘贴您的输出,以便我们帮助您调整代码以获得所需的输出。
  • $path="C:\Users\sumith\filename.log"; $status=select-string -path $path -pattern "Install_status" ,输出为 C:\Users\sumith\filename.log:79:ISS_LOG [14:45:41]: INSTALL_STATUS:SUCCESS 如果我给$status=select-string -path $path -pattern "Install_status" | {$_.Line} 输出将是 ISS_LOG [14:45:41]: INSTALL_STATUS:SUCCESS 现在我想删除 ISS_LOG [14:45:41]: from output @ChetanKulkarni

标签: powershell


【解决方案1】:

IMO 你最好使用正则表达式:

$File = ".\filename.log"
$Content = (Get-Content $File -raw)

$Pattern = [regex]'INSTALL_STATUS:\s*(\w+)'

"Using -Match operator"
if ($Content -Match $Pattern){
   $Matches[0]
   $Matches[1]
} Else {
  "couldn#T find a match"
}

"Using [RegEx] .Matches method"

$Matches = $Pattern.Matches($Content)

$Matches.Captures[0].Value
$Matches.Captures.Groups[1].Value

您的问题和评论在文件内容上有所不同,
冒号后面的空格INSTALL_STATUS: SUCCESS

样本输出:

Using -Match operator
INSTALL_STATUS: SUCCESS
SUCCESS
Using [RegEx] .Matches method
INSTALL_STATUS: SUCCESS
SUCCESS

【讨论】:

  • $Matches = $Pattern.Matches($Content) 从这里我将得到带有我不想要的其他详细信息的输出。当我给$Matches.Captures[0].Value 这个输入时,它显示错误无法索引到空数组,我尝试了一些其他索引值但显示相同的错误
  • 是的,它已经给出了安装状态和其他一些关于该行的值
【解决方案2】:

试试这个,

$status=select-string -path $path -pattern "Install_status" | {$_.Line}
$status.Substring(19)OR

 $status=select-string -path $path -pattern "Install_status" | {$_.Line}
$status.Substring($status.IndexOf('IN'))

or

 $status=select-string -path $path -pattern "Install_status" | {$_.Line}
 $status.Substring($status.IndexOf(']:')+2)


    Or using Regex (Credits to LotPengs)
 $Content=Get-Content D:\creditdetails.txt
$Pattern = [regex]'INSTALL_STATUS:\s*(\w+)'
if( $Pattern.Matches($Content) -ne $null){
$Matches=$Pattern.Matches($Content)
$Matches.Captures[0].Value 
}else{
$Matches='No Match Found'
}

假设日志结构保持不变。

【讨论】:

  • 有什么方法可以在不进行硬编码的情况下获得输出?
  • 有很多方法,只要日志结构保持不变,如果可能的话,让我们知道日志的样子。
  • 这是日志文件的一部分,您可以在 'ISS_LOG [14:45:41] 末尾看到安装状态:================ ==================================================== ==================================================== ================================== ISS_LOG [14:45:41]: 事件: OnSumithSetupEnd ISS_LOG [14: 45:41]:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{A13B05B8-C7C2-4275-9B52-5BDE7142655F} 不存在。 ISS_LOG [14:45:41]:ISD 版本:和注册表显示版本:ISS_LOG [14:45:41]:INSTALL_STATUS:SUCCESS`
  • 看看这些日志,我可以说在每一行新的日志中都有 ISS_LOG[XX:XX:XX]:,这些是固定的,因此硬编码可能是最好的解决方案。作为第一个19个字符没用。
  • $Content=Get-Content 文件名 $Pattern = [regex]'INSTALL_STATUS:\s*(\w+)' $Matches = $Pattern.Matches($Content) $Matches.Captures[0] .Value $Matches.Captures.Groups[1].Value
【解决方案3】:

对于控制台输出(修改后的 Chetan Kulkarni 答案)

(Select-String -Path .\file.txt -Pattern 'abcde').line

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多