Unix tail equivalent command in Windows Powershell

后端 未结 13 1565
攒了一身酷
攒了一身酷 2020-11-28 00:13

I have to look at the last few lines of a large file (typical size is 500MB-2GB). I am looking for a equivalent of Unix command tail for Windows Powershell. A f

相关标签:
13条回答
  • 2020-11-28 00:36

    PowerShell Community Extensions (PSCX) provides the Get-FileTail cmdlet. It looks like a suitable solution for the task. Note: I did not try it with extremely large files but the description says it efficiently tails the contents and it is designed for large log files.

    NAME
        Get-FileTail
    
    SYNOPSIS
        PSCX Cmdlet: Tails the contents of a file - optionally waiting on new content.
    
    SYNTAX
        Get-FileTail [-Path] <String[]> [-Count <Int32>] [-Encoding <EncodingParameter>] [-LineTerminator <String>] [-Wait] [<CommonParameters>]
    
        Get-FileTail [-LiteralPath] <String[]> [-Count <Int32>] [-Encoding <EncodingParameter>] [-LineTerminator <String>] [-Wait] [<CommonParameters>]
    
    DESCRIPTION
        This implentation efficiently tails the cotents of a file by reading lines from the end rather then processing the entire file. This behavior is crucial for ef
        ficiently tailing large log files and large log files over a network.  You can also specify the Wait parameter to have the cmdlet wait and display new content
        as it is written to the file.  Use Ctrl+C to break out of the wait loop.  Note that if an encoding is not specified, the cmdlet will attempt to auto-detect the
         encoding by reading the first character from the file. If no character haven't been written to the file yet, the cmdlet will default to using Unicode encoding
        . You can override this behavior by explicitly specifying the encoding via the Encoding parameter.
    
    0 讨论(0)
  • 2020-11-28 00:36

    Probably too late for an answere but, try this one

    Get-Content <filename> -tail <number of items wanted>
    
    0 讨论(0)
  • 2020-11-28 00:39

    try Windows Server 2003 Resource Kit Tools

    it contains a tail.exe which can be run on Windows system.

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

    0 讨论(0)
  • 2020-11-28 00:41

    Just some additions to previous answers. There are aliases defined for Get-Content, for example if you are used to UNIX you might like cat, and there are also type and gc. So instead of

    Get-Content -Path <Path> -Wait -Tail 10
    

    you can write

    # Print whole file and wait for appended lines and print them
    cat <Path> -Wait
    # Print last 10 lines and wait for appended lines and print them
    cat <Path> -Tail 10 -Wait
    
    0 讨论(0)
  • 2020-11-28 00:41

    I took @hajamie's solution and wrapped it up into a slightly more convenient script wrapper.

    I added an option to start from an offset before the end of the file, so you can use the tail-like functionality of reading a certain amount from the end of the file. Note the offset is in bytes, not lines.

    There's also an option to continue waiting for more content.

    Examples (assuming you save this as TailFile.ps1):

    .\TailFile.ps1 -File .\path\to\myfile.log -InitialOffset 1000000
    .\TailFile.ps1 -File .\path\to\myfile.log -InitialOffset 1000000 -Follow:$true
    .\TailFile.ps1 -File .\path\to\myfile.log -Follow:$true
    

    And here is the script itself...

    param (
        [Parameter(Mandatory=$true,HelpMessage="Enter the path to a file to tail")][string]$File = "",
        [Parameter(Mandatory=$true,HelpMessage="Enter the number of bytes from the end of the file")][int]$InitialOffset = 10248,
        [Parameter(Mandatory=$false,HelpMessage="Continuing monitoring the file for new additions?")][boolean]$Follow = $false
    )
    
    $ci = get-childitem $File
    $fullName = $ci.FullName
    
    $reader = new-object System.IO.StreamReader(New-Object IO.FileStream($fullName, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [IO.FileShare]::ReadWrite))
    #start at the end of the file
    $lastMaxOffset = $reader.BaseStream.Length - $InitialOffset
    
    while ($true)
    {
        #if the file size has not changed, idle
        if ($reader.BaseStream.Length -ge $lastMaxOffset) {
            #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
        }
    
        if($Follow){
            Start-Sleep -m 100
        } else {
            break;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 00:44

    Very basic, but does what you need without any addon modules or PS version requirements:

    while ($true) {Clear-Host; gc E:\test.txt | select -last 3; sleep 2 }

    0 讨论(0)
提交回复
热议问题