vinduer - hvordan man gør hvad hoved, hale, mere, mindre, sed gør i Powershell?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har brug for disse kommandoer til at tjekke logfil på Windows, men jeg installerer ikke noget program, og jeg kan godt lide Powershell med Windows.

Bedste reference


Get-Content (alias: gc) er din normale mulighed for at læse en tekstfil. Du kan derefter filtrere yderligere:


gc log.txt | select -first 10 # head
gc -TotalCount 10 log.txt     # also head
gc log.txt | select -last 10  # tail
gc -Tail 10 log.txt           # also tail (since PSv3), also much faster than above option
gc log.txt | more             # or less if you have it installed
gc log.txt | \%{ $\_ -replace 'd+', '($0)' }         # sed


Dette fungerer godt nok til små filer, større (mere end et par MiB) er nok lidt langsomme.


PowerShell Community Extensions indeholder nogle cmdlets til specialiserede filer (f.eks. Get-FileTail). [23]

Andre referencer 1


Her er de indbyggede måder at gøre head og tail. Brug ikke rør, hvis du har en stor fil, vil det være ekstremt langsomt. Brug af disse indbyggede muligheder vil være ekstremt hurtig selv for store filer.


gc log.txt -head 10 
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f

Andre referencer 2


more.exe findes på Windows, kan porte på less nemt findes (og PowerShell Community Extensions, PSCX, indeholder en). [24]


PowerShell giver ikke noget alternativ til at adskille programmer til enten, men for strukturerede data Out-Grid kan det være nyttigt.


Head og Tail kan begge emuleres med Select-Object ved hjælp af henholdsvis -First og -Last parametrene.


Sed funktioner er alle tilgængelige, men struktureret ret forskelligt. Filtreringsindstillingerne er tilgængelige i Where-Object (eller via Foreach-Object og noget tilstand for intervaller). Andet, transformerende, operationer kan gøres med Select-Object og Foreach-Object.


Men da PowerShell passerer (.NET) objekter - med alle deres typede strukturer, f.eks. datoer forbliver DateTime tilfælde - snarere end bare strenge, som hver kommando skal analysere sig selv, meget af sed og andre sådanne programmer er overflødige.

Andre referencer 3


Hvis du har brug for at forespørge store (eller små) logfiler på Windows, er det bedste værktøj, jeg har fundet, Microsofts gratis Log Parser 2.2. Du kan kalde det fra PowerShell, hvis du vil, og det vil gøre alt tungt løft for dig, og meget hurtigt også. [25]

Andre referencer 4


Jeg fik nogle bedre løsninger:


gc log.txt -ReadCount 5 | \%{$\_;throw "pipeline end!"} # head
gc log.txt | \%{$num=0;}{$num++;"$num $\_"}             # cat -n
gc log.txt | \%{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $\_"}} # sed