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.