【问题标题】:Remove path from output从输出中删除路径
【发布时间】:2015-07-05 16:35:37
【问题描述】:

在 PowerShell 中使用以下 Select-String 命令:

Select-String -Path E:\Documents\combined0.txt -Pattern "GET /ccsetup\.exe" -AllMatches > E:\Documents\combined3.txt

创建一个输出文件,每行以路径和文件名开头,后跟一个冒号。例如:

E:\Documents\combined0.txt:255:255.255.255 - - [31/Dec/2014:04:15:16 -0800] "GET /ccsetup.exe HTTP/1.1" 301 451 "-" "Mozilla/5.0 (compatible; SearchmetricsBot; http://www.xxxx.com/en/xxxx-bot/)"

如何去掉结果中的输出文件路径名、输出文件名和冒号?

【问题讨论】:

    标签: powershell select-string


    【解决方案1】:

    Select-String 输出一个对象,您可以从中选择所需的属性。 Get-Member 命令将向您显示这些对象成员,如果您输入它,例如:

    Select-String -Path E:\Documents\combined0.txt -Pattern "GET /ccsetup\.exe" -AllMatches  | 
        Get-Member
    

    其中一个属性是Line。所以试试这个方法:

    Select-String -Path E:\Documents\combined0.txt -Pattern "GET /ccsetup\.exe" -AllMatches | 
        Foreach {$_.Line} > E:\Documents\combined3.txt
    

    【讨论】:

      【解决方案2】:

      与往常一样,powershell 将事物作为对象返回,默认情况下 select-string 返回几个属性,包括 LineNumber、Filename 等;您想要包含数据的那个只是称为“线”。所以不需要任何花哨的东西,只需将其通过管道传输到“选择行”即可。

      例如:

      Select-String "bla" filename.txt | select-object -ExpandProperty Line | out-file E:\bla_text.txt
      

      【讨论】:

        【解决方案3】:

        如果您正在寻找(子)字符串而不是模式,则使用 -like 运算符可能是一种更好的方法,无论是在性能方面还是在易用性方面。

        $searchString = 'GET /ccsetup.exe'
        
        Get-Content 'E:\Documents\combined0.txt' |
          ? { $_ -like "*$searchString*" } |
          Set-Content 'E:\Documents\combined3.txt'
        

        如果您确实需要模式匹配,您可以轻松地将 -like 运算符替换为 -match 运算符:

        $pattern = 'GET /ccsetup\.exe'
        
        Get-Content 'E:\Documents\combined0.txt' |
          ? { $_ -match $pattern } |
          Set-Content 'E:\Documents\combined3.txt'
        

        【讨论】:

          【解决方案4】:
          Get-Content E:\Documents\combined0.txt | Select-String -Pattern "GET /ccsetup\.exe" -AllMatches
          

          【讨论】:

            【解决方案5】:
            # define your search path
            $files = Get-ChildItem "./some_path"
            
            
            for ($i=0; $i -lt $files.Count; $i++) {
                # loop through files in search folder
                $x=Select-String -Path $files[$i].FullName -Pattern "whatYouSearch"
                # retrieve the info with the option Line
                $out=$x.Line 
                # echo to output file (append)
                $out >> result.csv
            }
            

            【讨论】:

            • 嘿,保罗,对于同一个问题,这是一种不同的方法。另外,您在控制流中有循环变量 $i,以便您可以实现条件来管道/追加/初始化。
            【解决方案6】:

            我发现了这个并想要一种更简单的方法来过滤掉确切的文本。我在“Select-String -Path C:\Temp\AccountLockoutPolicy.Txt -Pattern 'ResetLockoutCount ='”末尾使用了“| select-object -ExpandProperty Line”,它删除了路径和行号。我喜欢简单!

            【讨论】:

            【解决方案7】:

            优雅的解决方案:

            PS> type .\test.txt
            abc 
            abc123 
            xyz 
            xyz123
            
            PS> $(Select-String "123" .\test.txt).Line
            abc123 
            xyz123
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-10-12
              • 2021-01-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多