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 tail
voor 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 -wait
met 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-FileTail
cmdlet. 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.exe
die 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.ps1
voor 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 }