Equivalente di Windows del comando "tail"


107

Esiste un modo per simulare il comando * nix tail sulla riga di comando di Windows? Ho un file e voglio un modo per tagliare le prime n righe di testo. Per esempio:

D:\>type file.txt
line one
line two
line three
D:\>*[call to tail]* > result.txt

D:\>type result.txt
line two
line three

10
Non headmostra solo le prime n righe invece di tralasciarle?
Joey

Per favore Chris considera le nuove risposte dal 2009, più specificamente la risposta di Amit Portnoy . Poiché la tua domanda è generale, molti utenti potrebbero trovare questa pagina web. E potrebbero smettere di leggere le risposte dopo la prima: la risposta che hai accettato. Puoi cambiare la risposta che hai accettato con un'altra più aggiornata alle possibilità odierne. Saluti;)
olibre

Sono un po 'confuso. La domanda originale riguardava il headcomando in stile Unix , ma l'output desiderato sembrava mancare tail. Sembra che le risposte riguardino heade no tail.
Blakeoft

@blakeoft la domanda originale chiedeva il comportamento di tail, tuttavia il titolo dicevahead
MM

Risposte:


89

Nessun equivalente esatto. Tuttavia esiste un comando DOS nativo "more" che ha un'opzione + n che inizierà a produrre il file dopo l'ennesima riga:

Prompt DOS:

C:\>more +2 myfile.txt

Il comando precedente produrrà tutto dopo le prime 2 righe.
Questo è in realtà l'inverso di Unix head :

Console Unix:

root@server:~$ head -2 myfile.txt

Il comando precedente stamperà solo le prime 2 righe del file.


8
No, non è la stessa cosa. tailinizia a contare dalla fine del file. Quindi, tail -2stamperà le ultime due righe.
ADTC

5
Posso stampare anche i primi n caratteri?
Qwerty

@ADTC (la mia versione di) tail non supporta i negativi. only head does (gnuwin32)
nl-x

@ nl-x -2non è negativo. È solo una versione abbreviata di -n 2(numero di righe). Sfortunatamente, troppe implementazioni di tailnon supportano -2, rendendolo molto incoerente con le headimplementazioni di accompagnamento che lo fanno. Mi ha infastidito troppe volte.
ADTC

@ADTC Ah scusa. Ero confuso con head -n -2quale è diverso da head -n 2. Ma con la coda, quest'ultimo non esiste.
nl-x

111

SE hai installato Windows PowerShell (penso che sia incluso da XP) puoi semplicemente eseguire da cmd.exe:

Comando capo:

powershell -command "& {Get-Content *filename* -TotalCount *n*}"

Comando di coda:

powershell -command "& {Get-Content *filename* | Select-Object -last *n*}"

oppure, direttamente da PowerShell:

Get-Content *filename* -TotalCount *n*
Get-Content *filename* | Select-Object -last *n*


aggiornare

PowerShell 3.0 (Windows 8 e versioni successive) ha aggiunto il Tailcomando con alias Last. Heade sono stati aggiunti anche gli Firstalias di TotalCount.

Quindi, i comandi possono essere riscritti come

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*

Questo non si comporta come headinvece di tail?
blakeoft

@ Blakeoft sì lo ha fatto ... ho aggiornato la mia risposta. È incredibile che ci siano voluti 2 anni e 17 voti prima che qualcuno commentasse questo.
Amit Portnoy

@blakeoft si è appena reso conto che la domanda è stata modificata! (vedi stackoverflow.com/posts/1295068/revisions). Originariamente chiedeva il comando principale ... aggiornato per includere entrambe le risposte ...
Amit Portnoy

2
@ AmitPortnoy Ho trovato un'altra risposta da qualche parte su questo scambio di stack dicendo che ora Get-Contentha un comando di coda. Ad esempio, Get-content -Tail 5 file.txtstamperà le ultime cinque righe di file.txt. Grazie per aver aggiornato la tua risposta btw.
Blakeoft

2
qualche modo per usarlo come filtro? (es. leggere stdin invece del file)
eadmaster

24
more /e filename.txt P n

dove n = il numero di righe da visualizzare. Funziona velocemente ed è esattamente come il headcomando.


14
Comandi come P, S, ecc. Possono essere inseriti dall'utente solo al prompt. Non possono essere passati al comando more. Pertanto, l'esempio sopra non funziona
Philibert Perusse


12

Questo è un trucco totale, ma se si tratta di un file enorme che vuoi esaminare solo il formato, l'intestazione, ecc. E stai cercando una soluzione, puoi sempre reindirizzare l'output `` altro '' a un nuovo file e CTRL-C velocemente. Le righe di output non possono essere controllate con precisione e molto probabilmente lo ucciderai nel mezzo di una riga di output, ma è un modo economico per afferrare una piccola parte di un file altrimenti inutilizzabile.

Ex.

C: \ altro test.csv> test.txt 
^ C C: \ more test.txt
riga 1
riga 2
ecc ... C: \

9

Bene, questo lo farà , ma è veloce quasi quanto sembra (approssimativamente O (n * m), dove n è il numero di righe da visualizzare em è il numero totale di righe nel file):

for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" filename ^| findstr /r "^%l:"') do @echo %b

Dove "10" è il numero di righe che si desidera stampare e "nomefile" è il nome del file.


6
+1 per una soluzione che ha richiesto più tempo per la digitazione rispetto al download di una porta di head.
Camilo Martin

1
Nota: Metti questa espressione tra parentesi - (expr) > out.txt- quando invii i risultati a un file, altrimenti otterrai solo l'ultima riga. Oppure aggiungi - expr >> out.txt.
cz

9

PowerShell:

Get-Content C:\logs\result.txt -Tail 10

Get-Content C:\logs\result.txt -wait (monitor the tail)

Questa è la risposta corretta, aggiornata e pertinente (a differenza di cmd). Grazie.
cudacoder

7

Quando usi più + n che Matt ha già menzionato, per evitare pause nei file lunghi, prova questo:

più +1 miofile.txt> con

Quando reindirizzi l'output da more, non si interrompe e qui reindirizza alla console. Allo stesso modo puoi reindirizzare a qualche altro file come questo senza le pause di più se questo è il risultato finale desiderato. Usa> per reindirizzare al file e sovrascriverlo se esiste già, o >> per aggiungere a un file esistente. (Puoi usare entrambi per reindirizzare a con.)



5

Get-content -Tail n file.txtcon PowerShell è l'unica cosa che si avvicina a tailLinux.

Quanto Get-Content *filename* | Select-Object -last *n*suggerito sopra carica / analizza il tutto. Inutile dire che non era soddisfatto del mio file di registro da 10 GB ... L' -Tailopzione inizia alla fine del file.



2

Ecco un veloce comando nativo head che ti dà le prime 9 righe in DOS.

findstr /n "." myfile.txt | findstr "^.:"

I primi 2 caratteri su ogni riga saranno il numero di riga.



2

in PS prova a usare il comando:

Select -Last 1

Anche questo comando può essere pipeline.

Esempio per ottenere la prima riga:

type .\out.txt | Select -Last 1

o per ottenere la prima riga:

 type .\out.txt | Select -First 1

1

FWIW, per coloro che hanno solo bisogno di ritagliare un numero indeterminato di record dall'intestazione del file, altro> funziona bene. Questo è utile solo per avere un file più piccolo con cui lavorare nelle prime fasi di sviluppo di qualcosa.


1

Non ho provato a estrarre un intervallo, ma sono riuscito a ottenere una riga utilizzando il seguente comando DOS:

find /N " " *.log|find "[6]" 

Poiché la maggior parte dei file contiene spazi, questo comando estrae ogni riga da tutti i file LOG e sostanzialmente li numera a partire da 1 per ogni file. I risultati numerati vengono quindi convogliati nel secondo FINDcomando che cerca la riga contrassegnata come numero 6.


1

C'è headun'utilità gratuita in questa pagina che puoi usare. Non l'ho ancora provato.


1
Non sono sicuro del motivo per cui questo è stato downvoted. Viene eseguito esattamente come l'utilità principale di UNIX.
coson

1
È un collegamento per il download. Dovrebbe codificare il binario e incorporarlo nella risposta?
GargantuChet

0
set /p line= < file.csv 
echo %line%

restituirà la prima riga del file in cmd Windows nella variabile% line%.



-2

Non credo che ci sia via d'uscita dagli schemi. Non esiste un tale comando in DOS e i file batch sono molto limitati a simularlo (senza grossi problemi).


-2

Attenzione, l'utilizzo del file batch per, token e funzionalità delim su input di testo sconosciuto può essere un disastro a causa della speciale interpretazione di caratteri come &,!, <, Ecc. Tali metodi dovrebbero essere riservati solo al testo prevedibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.