Powershell中的Select-String只显示文本文件中的部分行,需要它来显示整个内容

时间:2017-07-04 04:50:43

标签: powershell cmdlet select-string

我正在尝试编写一个简单的PS脚本来检查大型.txt日志文件中的短字符串:“SRVE0242I:”

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object line | Out-String

在输出时,它只显示以下内容:

线
[28/06/17 13:48:27:839] 00000020 ServletWrappe I SRVE0242I:[用户] [用户] [com_xxxxxxx _...

而不是全线。这会拉多少个字符是否有限制?我找不到有关Select-String cmdlet的任何限制的任何信息。有没有更好的方法来做到这一点,所以我不a)在我的行列表中拉出标题“行”(不是真的想为这样一个简单的输出创建表格格式)和b)得到整行当我提取信息时?

2 个答案:

答案 0 :(得分:4)

你看到它是这样的,因为它使用默认的Line视图显示Format-Table属性并将其缩短到控制台的宽度。

请改为:

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object -ExpandProperty line

这会将Line属性的值作为字符串返回给$lines变量。您无需使用Out-String

答案 1 :(得分:2)

有!长话短说,Select-Object正在这里进行截断。这是获取Select-String输出中第一个未截断行的一种方法

$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line

当您遇到类似这样的事情时,您可以分解各个步骤,通过将事物传递给Get-Member来确定发生了什么。以下是上述代码中发生的事情:

Select-String <# args #> | Get-Member

Select-String为我们提供了一个MatchInfo对象,该对象(正如您已经正确确定的那样)有一个&#39; Line&#39;属性。当它自己运行时,Select-String实际上会吐出你正在寻找的所有信息,并且默认情况下不会截断它(至少在v6.0.0-beta上)。如果找到多个匹配项,它会为您提供一个MatchInfo对象数组,因此如果您只想要第一个匹配项,则必须索引到该数组(就像我上面所做的那样)。

Select-String <# args #> | Select-Object Line | Get-Member

Select-Object为对象应用PowerShell的默认格式,在大多数情况下,这些格式会截断输出以便于查看。对于具有一堆成员的对象(如MatchInfo对象),默认情况下它会尝试每行一个。

Select-String <# args #> | Select-Object Line | Out-String | Get-Member

Out-String 直接将其输入转换为字符串。也就是说,不是试图将某些东西转换为字符串或将字符串Property从传递给它的对象中拉出来,而是将它接收的任何内容更改为对象。在这种情况下,它将已经格式化的MatchInfo输出转换为字符串。终端上的输出没有任何反应,但Get-Member将显示一个String而不是MatchInfo对象。

此处并不直接相关,但如果您对修改默认格式感兴趣,则会受types.ps1xml文件的约束。