我必须查看一个大文件(典型大小为500MB-2GB)的最后几行。我正在寻找一个相当于Unix命令尾Windows Powershell。一些可供选择的方法是,

http://tailforwin32.sourceforge.net/

and

Get-Content [filename] | Select-Object -Last 10

对于我来说,第一种选择是不允许使用的,而第二种选择是很慢的。有人知道PowerShell的tail的有效实现吗?


当前回答

使用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
}

我在这里找到了大部分代码。

其他回答

对Get-Content使用-wait参数,它将显示添加到文件中的行。这个特性在PowerShell v1中就有了,但是由于某种原因在v2中没有很好地记录。

这里有一个例子

Get-Content -Path "C:\scripts\test.txt" -Wait

运行此命令后,更新并保存该文件,您将在控制台上看到更改。

我使用了这里给出的一些答案,但只是提醒一下

Get-Content -Path Yourfile.log -Tail 30 -Wait 

会在一段时间后咀嚼记忆。一个同事在过去的一天里留下了这样一个“尾巴”,它高达800 MB。我不知道Unix尾巴是否也有同样的行为(但我怀疑)。所以短期使用是可以的,但要小心。

使用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
}

我在这里找到了大部分代码。

尝试Windows Server 2003资源工具包工具

它包含一个tail.exe,可以在Windows系统上运行。

https://www.microsoft.com/en-us/download/details.aspx?id=17657

关于这个主题,我有一个关于多个文件的有用提示。

使用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 }