我必须查看一个大文件(典型大小为500MB-2GB)的最后几行。我正在寻找一个相当于Unix命令尾Windows Powershell。一些可供选择的方法是,
http://tailforwin32.sourceforge.net/
and
Get-Content [filename] | Select-Object -Last 10
对于我来说,第一种选择是不允许使用的,而第二种选择是很慢的。有人知道PowerShell的tail的有效实现吗?
我必须查看一个大文件(典型大小为500MB-2GB)的最后几行。我正在寻找一个相当于Unix命令尾Windows Powershell。一些可供选择的方法是,
http://tailforwin32.sourceforge.net/
and
Get-Content [filename] | Select-Object -Last 10
对于我来说,第一种选择是不允许使用的,而第二种选择是很慢的。有人知道PowerShell的tail的有效实现吗?
当前回答
尝试Windows Server 2003资源工具包工具
它包含一个tail.exe,可以在Windows系统上运行。
https://www.microsoft.com/en-us/download/details.aspx?id=17657
其他回答
从PowerShell 3.0版本开始,Get-Content cmdlet有一个-Tail参数,这应该会有所帮助。关于Get-Content,请参阅technet库的在线帮助。
有许多有效的答案,但是,没有一个与linux中的tail具有相同的语法。下面的函数可以存储在$Home\Documents\PowerShell\Microsoft.PowerShell_profile中。Ps1的持久性(请参阅powershell概要文档了解更多详细信息)。
这允许你调用…
tail server.log
tail -n 5 server.log
tail -f server.log
tail -Follow -Lines 5 -Path server.log
这与Linux语法非常接近。
function tail {
<#
.SYNOPSIS
Get the last n lines of a text file.
.PARAMETER Follow
output appended data as the file grows
.PARAMETER Lines
output the last N lines (default: 10)
.PARAMETER Path
path to the text file
.INPUTS
System.Int
IO.FileInfo
.OUTPUTS
System.String
.EXAMPLE
PS> tail c:\server.log
.EXAMPLE
PS> tail -f -n 20 c:\server.log
#>
[CmdletBinding()]
[OutputType('System.String')]
Param(
[Alias("f")]
[parameter(Mandatory=$false)]
[switch]$Follow,
[Alias("n")]
[parameter(Mandatory=$false)]
[Int]$Lines = 10,
[parameter(Mandatory=$true, Position=5)]
[ValidateNotNullOrEmpty()]
[IO.FileInfo]$Path
)
if ($Follow)
{
Get-Content -Path $Path -Tail $Lines -Wait
}
else
{
Get-Content -Path $Path -Tail $Lines
}
}
使用Powershell V2及以下版本时,get-content读取整个文件,因此对我来说没有任何用处。下面的代码可以满足我的需要,尽管字符编码可能存在一些问题。这实际上是tail -f,但是可以很容易地修改它以获得最后x个字节,或者如果您想向后搜索换行符,则可以修改它以获得最后x行。
$filename = "\wherever\your\file\is.txt"
$reader = new-object System.IO.StreamReader(New-Object IO.FileStream($filename, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [IO.FileShare]::ReadWrite))
#start at the end of the file
$lastMaxOffset = $reader.BaseStream.Length
while ($true)
{
Start-Sleep -m 100
#if the file size has not changed, idle
if ($reader.BaseStream.Length -eq $lastMaxOffset) {
continue;
}
#seek to the last max offset
$reader.BaseStream.Seek($lastMaxOffset, [System.IO.SeekOrigin]::Begin) | out-null
#read out of the file until the EOF
$line = ""
while (($line = $reader.ReadLine()) -ne $null) {
write-output $line
}
#update the last max offset
$lastMaxOffset = $reader.BaseStream.Position
}
我在这里找到了大部分代码。
对于那些以“打字越少越好”为原则的管理员来说,下面是我能找到的最短版本:
gc filename -wai -ta 10
关于这个主题,我有一个关于多个文件的有用提示。
使用PowerShell 5.2 (Win7和Win10)跟踪单个日志文件(如Linux中的'tail -f')很容易(只需使用“Get-Content MyFile -Tail 1 -Wait”)。然而,同时查看多个日志文件似乎很复杂。PowerShell 7。x+然而,我发现了一个简单的方法,使用“Foreach-Object - parallel”。这将同时执行多个“Get-Content”命令。例如:
Get-ChildItem C:\logs\*.log | Foreach-Object -Parallel { Get-Content $_ -Tail 1 -Wait }