Unix-staartequivalente opdracht in Windows Powershell

Ik moet naar de laatste paar regels van een groot bestand kijken (normale grootte is 500 MB-2 GB). Ik ben op zoek naar een equivalent van het Unix-commando tailvoor Windows Powershell. Een paar beschikbare alternatieven zijn,

http://tailforwin32.sourceforge.net/

en

Get-Content [bestandsnaam] | Selecteer-Object -Laatste 10

Voor mij is het niet toegestaan ​​om het eerste alternatief te gebruiken, en het tweede alternatief is traag. Weet iemand een efficiënte implementatie van tail voor PowerShell.


Antwoord 1, autoriteit 100%

Gebruik de parameter -waitmet Get-Content, die regels weergeeft wanneer ze aan het bestand worden toegevoegd. Deze functie was aanwezig in PowerShell v1, maar om de een of andere reden niet goed gedocumenteerd in v2.

Hier is een voorbeeld

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

Zodra u dit heeft uitgevoerd, werkt u het bestand bij en slaat u het op, waarna u de wijzigingen op de console zult zien.


Antwoord 2, autoriteit 45%

Voor de volledigheid vermeld ik dat Powershell 3.0 nu een -Tail-vlag heeft op Get-Content

Get-Content ./log.log -Tail 10

haalt de laatste 10 regels van het bestand

Get-Content ./log.log -Wait -Tail 10

haalt de laatste 10 regels van het bestand en wacht op meer

Ook voor die *nix-gebruikers: de meeste systemen alias catto Get-Content, dus dit werkt meestal

cat ./log.log -Tail 10

Antwoord 3, autoriteit 21%

Vanaf PowerShell versie 3.0 heeft de Get-Content cmdlet een -Tailparameter die zou moeten helpen. Zie de online help van de technet-bibliotheek voor Get-Content.


Antwoord 4, autoriteit 5%

Ik heb enkele van de antwoorden gebruikt die hier zijn gegeven, maar slechts een waarschuwing dat

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

zal na een tijdje geheugen opeten. Een collega liet de afgelopen dag zo’n “staartje” achter en het liep op tot 800 MB. Ik weet niet of Unix tail zich op dezelfde manier gedraagt ​​(maar ik betwijfel het). Het is dus prima om te gebruiken voor kortetermijntoepassingen, maar wees er voorzichtig mee.


Antwoord 5, autoriteit 3%

PowerShell Community Extensions (PSCX)biedt de Get-FileTailcmdlet. Het lijkt een geschikte oplossing voor de taak. Opmerking: ik heb het niet geprobeerd met extreem grote bestanden, maar de beschrijving zegt dat het de inhoud efficiënt achtervolgt en het is ontworpen voor grote logbestanden.

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.

Antwoord 6

probeer Windows Server 2003 Resource Kit Tools

het bevat een tail.exedie op een Windows-systeem kan worden uitgevoerd.

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


Antwoord 7

Er zijn veel geldige antwoorden geweest, maar geen van hen heeft de dezelfdesyntaxis als staart in linux. De volgende functie kan worden opgeslagen in uw $Home\Documents\PowerShell\Microsoft.PowerShell_profile.ps1voor persistentie (zie documentatie over powershell-profielenvoor meer details).

Hiermee kunt u bellen…

tail server.log
tail -n 5 server.log
tail -f server.log
tail -Follow -Lines 5 -Path server.log

wat vrij dicht in de buurt komt van de linux-syntaxis.

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

Antwoord 8

Het is mogelijk om alle UNIX-commando’s die voor Windows zijn gecompileerd te downloaden van deze GitHub-repository: https:/ /github.com/George-Ogden/UNIX


Antwoord 9

Heel eenvoudig, maar doet wat je nodig hebt zonder extra modules of PS-versievereisten:

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


Antwoord 10

Ik heb een handige tip over dit onderwerp met betrekking tot meerdere bestanden.

Een enkel logbestand (zoals ‘tail -f’ in Linux) volgen met PowerShell 5.2 (Win7 en Win10) is eenvoudig (gebruik gewoon “Get-Content MyFile -Tail 1 -Wait”). Het lijkt echter ingewikkeld om MEERDERElogbestanden tegelijk te bekijken. Met PowerShell 7.x+ heb ik echter een gemakkelijke manier gevonden door “Foreach-Object -Parrallel” te gebruiken. Dit voert meerdere ‘Get-Content’-commando’s tegelijk uit. Bijvoorbeeld:

Get-ChildItem C:\logs\*.log | Foreach-Object -Parallel { Get-Content $_ -Tail 1 -Wait }

Other episodes