【问题标题】:How to process Custom log data using Powershell?如何使用 Powershell 处理自定义日志数据?
【发布时间】:2017-08-05 22:12:49
【问题描述】:

我有一个日志文件,其中的数据用“|”分隔象征。喜欢

"Username|servername|access|password|group"
"Username|servername|access|password|group" 

我需要验证数据。并且,如果组列(记录)缺少信息或为空。我只需要将该行写入另一个文件。请帮我。提前致谢。

【问题讨论】:

    标签: powershell data-processing


    【解决方案1】:

    如果您只是检查丢失的数据,您可以使用“(\S+\|){4}\S+”的regex 进行快速检查。将Get-Content-ReadCount 参数一起使用,您可以一次批量处理几千条记录,从而最大限度地减少磁盘I/O 和内存使用量,而无需一次处理一条记录。

    Get-Content $inputfile -ReadCount 2000 |
    foreach { 
              $_ -notmatch '(\S+\|){4}\S+' |
              Add-Content $outputfile
             }
    

    【讨论】:

    • 感谢 Miolinor 的回答,我会尝试返回结果。
    【解决方案2】:

    您可以将'Import-CSV-Delimiter '|' 一起使用。如果您的文件没有标题行,您还需要使用-Header 来定义它。然后,您可以使用Where 过滤空组行,并再次使用Export-CSV-Delimiter 来创建仅包含这些行的新文件。

    例如:

    Import-CSV 'YourLog.log' -Delimiter '|' -Header 'Username','Servername','Access','Password','Group' |
        Where {$_.'Group' -eq ''} |
        Export-CSV 'EmptyGroupLines.log' -Delimiter '|'
    

    【讨论】:

    • 感谢您的回答标记,我会尝试并返回我的结果。
    【解决方案3】:

    如果你的组列总是在同一个地方,看起来就是这样,你可以使用 split 方法。您当然可以整理代码。我用下面的例子来说明如何使用 split。

    foreach 语句将遍历文件中的每一行。 if (!$($groupstring.Split('|')[4])) 检查它是否为空。

    $groupstring = 'Username|servername|access|password|group'
    $groupstring.Split('|')[4]
    
    
    foreach ($item in $collection)
    {
        if (!$($groupstring.Split('|')[4])) 
        {
            Write-Host "variable is null" 
        }
    }
    

    希望这会有所帮助。 谢谢,蒂姆。

    【讨论】:

    • 感谢蒂姆的回答,我会尽力返回结果。
    • 不用担心 Subhantech。看看我的回答,我没有导出你要求的整条线。 Mark Wragg 和@mjoliner 看起来是不错的答案。
    • 不,不,蒂姆,感谢您的回答。对我来说,还没有确定的答案,因为我正在验证所有的可能性。而且,我也在尝试你的解决方案。哪个好。我做的第一个方法是拆分方法。这就是为什么我没有立即检查您的解决方案。我喜欢马克的回答,因为它对我有用。但是,还有很长的路要走。因为我的剧本很大,我正在学习所有的可能性。我给出的例子只是我想要的一个摘要。
    猜你喜欢
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2021-09-27
    • 1970-01-01
    • 2011-03-08
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多