Powershell: Import-CSV ,定界符和拆分组合 - 如何?

Powershell: Import-CSV , delimiter and split combined - how?

Objective: 遍历包含带有日志文件的子目录的目录,使用 Powershell 以 Syslog RFC 5424 IETF 格式在日志文件的列中列出主机名。 输出: 主机列表,它们的 IP 和日志行的时间戳

日志文件中的格式为:col1 TAB col2 TAB col3 TAB col4 TAB col5 TAB col6

col6 包含各种项目,由单个 SPACE 分隔,我在主机名之后(在示例中:MyHost01)。

到目前为止,下面的例子给了我很多这样的行:

2020-12-14 16:16:13 User.Notice  10.100.210.60 1 2020-12-14T16:17:44.755522+00:00 MyHost01 - - - [NXLOG@14506 EventReceivedTime="2020-12-14 16:17:43" SourceModuleName="auditlog" SourceModule... 
# Example - yields timestamp, info, IP address and raw message
$filelist = Get-ChildItem -Recurse -Path D:\Logs -Include *.txt
foreach ($textfile in $filelist) {
    $filepath = $textfile.fullname
    Import-Csv $filepath -Delimiter "`t" -Header col1,col3,col4,col6 |  Format-Table col1,col3,col4,col6
}

为了实现我的 objective,我需要将 col6 除以 SPACE。如何在我的脚本中完成此操作?

我在您的示例数据中看不到制表符。假设主机名是第 6 列的第一个子字符串:

Import-Csv $filepath -Delimiter "`t" -Header col1,col3,col4,col6 | 
    Select-Object col1, col3, col4, @{ n = 'col6'; e = { ( $_.col6 -split ' ' )[0] } } |
    Format-Table

Select-Object is used to to pass through columns 1, 3 and 4. Column 6 is defined as a calculated property 通过使用哈希表,它是以下形式的缩写:

@{ 
    name = 'col6'                                # Name of the output column 
    expression = { ( $_.col6 -split ' ' )[0] }   # Calculated value
}

在表达式中,-split 运算符用于将第 6 列的原始值拆分为 space,其中 returns 是一个子字符串数组。该数组的第一个元素将是用于第 6 列的值。如果需要提取另一个子字符串,请将索引 [0] 更改为其他内容。