Powershell:导入 CSV 、分隔符和拆分组合 - 如何?

问题描述

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

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

col6 包含各种项目,由一个空格分隔,我在主机名之后(在示例中: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,col6
}

为了实现我的目标,我需要按 SPACE 拆分 col6。这如何在我的脚本中完成?

解决方法

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

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

Select-Object 用于传递第 1、3 和 4 列。第 6 列通过使用哈希表定义为 calculated property,其缩写形式为:

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...