Powershell 在最后一次出现字符串后从文本文件中获取行
Powershell getting lines from a text file after the last occurrence of a string
我有一个正在使用的 robocopy 日志文件,我需要使用 powershell 提取摘要行。我 运行 遇到的问题是摘要的行数长度并不总是相同。
假设日志文件如下所示:
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Tue Dec 01 06:55:11 2015
Source : C:\Source Path
Dest : E:\Destination Path
Files : *.*
Options : *.* /TEE /S /E /COPY:DAT /PURGE /MIR /NP /R:2 /W:2
------------------------------------------------------------------------------
List of files here
List of files here
List of files here
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 945 0 945 0 0 0
Files : 10118 4 10114 0 0 3
Bytes : 1.245 g 323.9 k 1.244 g 0 0 0
Times : 0:00:17 0:00:00 0:00:00 0:00:17
Speed : 5264920 Bytes/sec.
Speed : 301.261 MegaBytes/min.
Ended : Tue Dec 01 06:55:28 2015
我可以用命令$summary = Get-Content $log | Select-Object -last 11 | Out-String
静态获取文件的最后11行,但是只有当数据实际移动时才会列出这两条速度线,否则会导致文件的最后一行列表。最终不是一个大问题,但它看起来不是很漂亮。
在最后一次(或第 4 次,总是有 4 次)出现分隔符 ---------------
之后,我如何从文件中获取最后一行而不是设定的行数?
我找到了解决方案,但我觉得必须有更好的方法。第一个命令找到所有分隔符,并将行号输出到 $finds
数组,然后是第二行,使用 $finds
数组中的最后一个元素作为提取摘要的起点。
希望这对其他人有帮助!
$finds = Get-Content $log | Select-string "--------------" | Select-Object LineNumber
$summary = Get-Content $log | Select-Object -skip $finds[-1]."LineNumber" | Out-String
Get-Content $log | Select-String 'Total' -Context 0,20
解释:Select-STring
查找任何包含 'Total' 的行。参数 -Context 0,20
告诉它在匹配行之后最多显示 20 行(之前为零行)。
如果你复制一个像'sales_total.txt'这样的文件,这一行也会匹配。为防止这种情况,您可以使匹配字符串更明确。例如使用完整的行。
试试这个:
Get-Content $log -Delimiter ('-'*78) |
Select -last 1
我有一个正在使用的 robocopy 日志文件,我需要使用 powershell 提取摘要行。我 运行 遇到的问题是摘要的行数长度并不总是相同。
假设日志文件如下所示:
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Tue Dec 01 06:55:11 2015
Source : C:\Source Path
Dest : E:\Destination Path
Files : *.*
Options : *.* /TEE /S /E /COPY:DAT /PURGE /MIR /NP /R:2 /W:2
------------------------------------------------------------------------------
List of files here
List of files here
List of files here
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 945 0 945 0 0 0
Files : 10118 4 10114 0 0 3
Bytes : 1.245 g 323.9 k 1.244 g 0 0 0
Times : 0:00:17 0:00:00 0:00:00 0:00:17
Speed : 5264920 Bytes/sec.
Speed : 301.261 MegaBytes/min.
Ended : Tue Dec 01 06:55:28 2015
我可以用命令$summary = Get-Content $log | Select-Object -last 11 | Out-String
静态获取文件的最后11行,但是只有当数据实际移动时才会列出这两条速度线,否则会导致文件的最后一行列表。最终不是一个大问题,但它看起来不是很漂亮。
在最后一次(或第 4 次,总是有 4 次)出现分隔符 ---------------
之后,我如何从文件中获取最后一行而不是设定的行数?
我找到了解决方案,但我觉得必须有更好的方法。第一个命令找到所有分隔符,并将行号输出到 $finds
数组,然后是第二行,使用 $finds
数组中的最后一个元素作为提取摘要的起点。
希望这对其他人有帮助!
$finds = Get-Content $log | Select-string "--------------" | Select-Object LineNumber
$summary = Get-Content $log | Select-Object -skip $finds[-1]."LineNumber" | Out-String
Get-Content $log | Select-String 'Total' -Context 0,20
解释:Select-STring
查找任何包含 'Total' 的行。参数 -Context 0,20
告诉它在匹配行之后最多显示 20 行(之前为零行)。
如果你复制一个像'sales_total.txt'这样的文件,这一行也会匹配。为防止这种情况,您可以使匹配字符串更明确。例如使用完整的行。
试试这个:
Get-Content $log -Delimiter ('-'*78) |
Select -last 1