Parsing 通过文本文件解析并写出数据

Parsing 通过文本文件解析并写出数据,parsing,powershell,powershell-2.0,printers,Parsing,Powershell,Powershell 2.0,Printers,我正在着手创建powershell脚本的第一步,该脚本将读取打印机日志(可能使用get-WMI cmdlet),并解析日志。之后,我计划将脚本输出到一个.txt文件,其中包括打印机的名称、打印机使用次数的计数器(如果可能)以及日志中的特定信息 为了做到这一点,我决定尝试反向工作。下面是日志的一小部分内容: 10 Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on R3556 via port

我正在着手创建powershell脚本的第一步,该脚本将读取打印机日志(可能使用get-WMI cmdlet),并解析日志。之后,我计划将脚本输出到一个.txt文件,其中包括打印机的名称、打印机使用次数的计数器(如果可能)以及日志中的特定信息

为了做到这一点,我决定尝试反向工作。下面是日志的一小部分内容:

10         Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***.  Size in bytes: 53704; pages printed: 2                                                                  20130219123105.000000-300  
10         Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***.  Size in bytes: 53700; pages printed: 2   
向后工作并首先关注解析,我希望能够具体获得“/GRP”、“R3446(通常,R**,因为这是打印机名称)”,并获得一个计数器,显示特定打印机在日志文件中出现的频率

自从我上次使用Powershell已经有一段时间了,但目前我已经设法创建了以下内容,以尝试实现我的目标:

Select-String -Path "C:\Documents and Settings\a411882\My Documents\Scripts\Print Parse Test.txt" -Pattern "/GPR", " R****" -AllMatches -SimpleMatch 
代码不会产生任何错误,但是我也无法在屏幕上显示任何输出,以查看是否捕获了/GRP和打印机名称。目前,我正在努力确保在担心任何计数器之前收集正确的输出。有谁能帮助我,告诉我我的代码有什么问题吗

谢谢

编辑:修复了我的代码中的一个小错误,该错误导致屏幕上没有显示任何数据。目前,该代码输出整个两行测试文本,而不是只输出/GPR和服务器名称。新的输出如下所示:

My Documents\Scripts\Print Parse Test.txt:1:10         Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on
 R3556 via port IP_***.***.***.***.  Size in bytes: 53704; pages printed: 2                                                  
                20130219123105.000000-300  
My Documents\Scripts\Print Parse Test.txt:2:10         Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on
 R3556 via port IP_***.***.***.***.  Size in bytes: 53700; pages printed: 2  
/GPR, R****, count: ## (although for now I'm less concerned about the counter)
我想试着让它最终看起来如下:

My Documents\Scripts\Print Parse Test.txt:1:10         Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on
 R3556 via port IP_***.***.***.***.  Size in bytes: 53704; pages printed: 2                                                  
                20130219123105.000000-300  
My Documents\Scripts\Print Parse Test.txt:2:10         Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on
 R3556 via port IP_***.***.***.***.  Size in bytes: 53700; pages printed: 2  
/GPR, R****, count: ## (although for now I'm less concerned about the counter)

你可以试试这个。它仅在出现
/GPR
(以及“printed on”中的“on”)时返回一行

Get-Content .\test.txt | % { 
    if ($_ -match '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)') {
        $_ -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
    }
}
我相信有更好的正则表达式版本。我还在学习:-)

编辑这更容易阅读。正则表达式仍在那里进行提取,但我首先使用/GPR筛选行,而不是使用
select string

Get-Content .\test.txt | Select-String -SimpleMatch -AllMatches -Pattern "/GPR" | % {
    $_.Line -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
}
获取内容。\test.txt |选择String-SimpleMatch-AllMatches-Pattern“/GPR”|%{

$\ Line-replace'(?:.*)(/GPR)(?:.*)(?我通常从我匹配的行的一个示例开始,然后用它构建一个正则表达式,用正则表达式元字符替换文本的可变部分。这使得正则表达式更长,但以后阅读更直观

将正则表达式分配给一个变量,然后在后续代码中使用该变量,以避免正则表达式的杂乱细节干扰代码的其余部分:

[regex]$DocPrinted = 
'Document \d\d, \w+/(\D{3})[0-9_]+: owned by \w+ was printed on (\w+) via port IP_[0-9.]+  Size in bytes: \d+; pages printed: \d+'

get-content <log file> |

foreach {
 if ($_ -match $DocPrinted)
   {
     $line -match $docprinted  > $null 
     $matches 
   }
 }                                                           
[regex]$DocPrinted=
'文档\d\d,\w+/(\d{3})[0-9\]+:由\w+拥有,通过端口IP打印在(\w+)上[0-9.]+大小(字节):\d+;打印页面:\d+'
得到满足|
弗雷奇{
如果($\匹配$DocPrinted)
{
$line-匹配$docprinted>$null
$matches
}
}                                                           

Remove
Write Host |
。您不能将一个空命令通过管道传输到另一个命令。
Select String
将自己输出结果graimer:我最初尝试不使用Write Host,但是每当我这样做时,都不会显示任何输出,因此我认为我必须以某种方式使用Write Host if
select string
不返回任何对象,这是因为它没有找到任何对象。它没有找到任何对象的原因是因为您拼错了“GPR”。“/GRP”不是“/GPR”:-)啊哈!!我知道我遗漏了一些愚蠢的东西,但就是看不到它=P现在我正在获取信息,但是目前它只是在重新编写整个2行测试txt。我现在只想输出/GPR和服务器名称哦哇…正则表达式。如果要求不太高,你能解释一下代码吗?我“我从未见过powershell如此严格地基于正则表达式编写。以下是我认为它正在做的事情,我想知道您是否可以更正我,以便我理解代码:它正在搜索/GPS和“on”、“on\s”之后的单词,可能是“on”、“w+”可能是指下一个词,但我不确定我是否理解“$1,$2”的含义。妄想症中的内容是一个组。有些是捕获(存储值),有些不是。第一组匹配下一组(/GPR)之前的所有内容并将其丢弃。第二组匹配/GPR并保留它。第三组等于第一组。然后我搜索“开”然后扔掉它(只是为了用R3556搜索这个地方)。然后我得到下一个单词(R3556)因为它是匹配的,所以所有的都将被我所指定的替换。我指定了‘1美元,2美元’,这意味着我用中间逗号保留了2个组。很难解释简短:PI增加了另一个例子,用“/GPR”找到字符串。首先使用
select string
,然后使用regex仅用于提取。它更漂亮:)在使用您编写代码的方法并稍微修改它之后,我想我开始了解它的工作原理了。:)如果我想添加更多我想搜索的内容(例如,另一个是DEV),那么我只需添加(?:*)(DEV)(?:*)和3美元?