powershell - 如何使用 power shell 过滤特定单词
问题描述
我想弄清楚谁在从 2008 年的打印服务器打印。我从服务器管理器生成了一个日志文件,现在将这些信息保存在一个 csv 文件中。我的目标是解析这些信息并将其导出到新的 csv 以找出唯一的关联user ID
,computer host name
并且printer name
,所有这些都包含在 csv 日志文件中,这样我就可以确定谁正在从该服务器打印并确保我可以将它们映射到我们的新打印服务器。csv 由一列具有模式的数据组成。
csv 中的每一行都遵循以下模式,但每一行的措辞都不同,因为作业名称更长/更短或我不想要的其他信息。
整体格局是:
Document #, job name owned by **user ID** on **computer host name** was printed on **printer name** through port ********
我不想要的更多信息
我的问题是我不能硬编码一些东西,比如忽略每行的前 5 个单词,然后第 6 个单词是用户 ID 等,因为每一行的格式都不同。
什么是我忽略所有单词的最佳方法,直到短语“拥有”甚至更好的用户 ID,将其保存到新的 csv 中,然后对计算机主机名和打印机名称执行相同的操作?
解决方案
使用正则表达式匹配可以很容易地做到这一点。正则表达式使用模式匹配,因此您可以执行以下操作:
Get-Content LogFile.csv | Where{$_ -match "^(.*?),.+? owned by (.+?) on (.+?) was printed on (.+?) through port (.+)"} | ForEach{
[PSCustomObject]@{
JobNumber=$Matches[1]
UserId=$Matches[2]
ComputerName=$Matches[3]
PrinterName=$Matches[4]
Port=$Matches[5]
}
}|Export-Csv NewLogFile.csv -NoTypeInfo
这将为您提供一个 CSV,您可以在 Excel 中打开或仅包含作业编号、用户 ID、他们使用的计算机、它所使用的打印机以及它所使用的端口。
推荐阅读
- c++ - C++ 中的 C2276 或 C3867 编译器错误
- php - 这段代码有什么问题,总是打印结果 0。在 phpmyadmin 中直接运行查询时,我得到了正确的结果
- html - 这是哪种输入类型?
- javascript - 如何动态更新 react-navigation tab-navigator 的 activeTintColor?
- javascript - JavaScript click() 打破了 Bootstrap 按钮的点击动画
- android - 删除arraylist中自定义对象的重复值
- java - 如何设置在服务器上显示上下文参数的优先顺序?
- android - 类依赖重复“程序类型已存在”
- c - c 中 strtok() 的使用显示警告并返回分段错误(核心转储)
- c++ - 如何提取字符串中的整数?