Equivalente de Windows del comando 'tail'

107

¿Hay alguna forma de simular el comando * nix tail en la línea de comandos de Windows? Tengo un archivo y quiero una forma de cortar las primeras n líneas de texto. Por ejemplo:

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

D:\>type result.txt
line two
line three
Chris Smith
fuente
10
¿No headmuestra solo las primeras n líneas en lugar de omitirlas?
Joey
Por favor, Chris considere las nuevas respuestas desde 2009, más específicamente la respuesta de Amit Portnoy . Como su pregunta es general, muchos usuarios pueden encontrar esta página web. Y pueden dejar de leer las respuestas después de la primera: la respuesta que has aceptado. Puedes cambiar la respuesta que has aceptado por otra más actualizada a las posibilidades actuales. Saludos;)
olibre
Estoy un poco confundido. La pregunta original era sobre el headcomando de estilo Unix , pero parecía que faltaba el resultado deseado tail. Parece que las respuestas son sobre heady no tail.
blakeoft
@blakeoft, la pregunta original preguntaba por el comportamiento de tail, sin embargo, el título decíahead
MM

Respuestas:

89

Sin equivalente exacto. Sin embargo, existe un comando nativo de DOS "más" que tiene una opción + n que comenzará a generar el archivo después de la enésima línea:

Indicador de DOS:

C:\>more +2 myfile.txt

El comando anterior generará todo después de las primeras 2 líneas.
Esta es en realidad la inversa de la cabeza de Unix :

Consola Unix:

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

El comando anterior imprimirá solo las 2 primeras líneas del archivo.

Matthew Nizol
fuente
8
No, no es lo mismo. tailcomienza a contar desde el final del archivo. Entonces, tail -2imprimirá las dos últimas líneas.
ADTC
5
¿Puedo imprimir los primeros n caracteres también?
Qwerty
@ADTC (mi versión de) tail no admite negativos. solo la cabeza lo hace (gnuwin32)
nl-x
@ nl-x -2no es negativo. Es solo una versión abreviada de -n 2(número de líneas). Desafortunadamente, demasiadas implementaciones de tailno son compatibles -2, lo que lo hace muy inconsistente con las headimplementaciones que lo acompañan . Me ha molestado demasiadas veces.
ADTC
@ADTC Ah, lo siento. Estaba confundido con head -n -2cuál es diferente de head -n 2. Pero con cola, este último no existe.
nl-x
111

SI tiene Windows PowerShell instalado (creo que está incluido desde XP), puede ejecutar desde cmd.exe:

Comando principal:

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

Comando de cola:

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

o, directamente desde PowerShell:

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


actualizar

PowerShell 3.0 (Windows 8 y superior) agregó Tailcomando con alias Last. Heady también se agregaron Firstalias a TotalCount.

Entonces, los comandos se pueden reescribir como

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*
Amit Portnoy
fuente
¿No se comporta esto como en headlugar de tail?
blakeoft
@blakeoft sí lo hizo ... He actualizado mi respuesta. Es sorprendente que hayan pasado 2 años y 17 votos antes de que alguien comentara sobre esto.
Amit Portnoy
¡@blakeoft acaba de darse cuenta de que la pregunta fue editada! (consulte stackoverflow.com/posts/1295068/revisions). Originalmente pidió el comando principal ... actualizado para incluir ambas respuestas ...
Amit Portnoy
2
@AmitPortnoy Encontré otra respuesta en algún lugar de este intercambio de pila que decía que ahora Get-Contenttiene un comando de cola. Por ejemplo, Get-content -Tail 5 file.txtimprimirá las últimas cinco líneas de file.txt. Gracias por actualizar tu respuesta por cierto.
blakeoft
2
alguna forma de usarlo como filtro? (por ejemplo, leer stdin en lugar de archivo)
eadmaster
24
more /e filename.txt P n

donde n = el número de filas para mostrar. Funciona rápido y es exactamente como un headcomando.

Dan
fuente
14
Los comandos como P, S, etc. solo pueden ser ingresados ​​por el usuario en el indicador. No se pueden pasar al comando more. Por lo tanto, el ejemplo anterior no funciona
Philibert Perusse
17

Puede obtener CoreUtils de GnuWin32 , que es una colección de herramientas estándar de Unix, portadas a Windows.

Entre otras cosas, contiene cabeza.

Sebastian Paaske Tørholm
fuente
12

Este es un truco total, pero si es un archivo enorme que solo desea examinar el formato, el encabezado, etc. y está buscando una solución, siempre puede redirigir la salida 'más' a un nuevo archivo y CTRL-C con rapidez. Las filas de salida no se pueden controlar con precisión y lo más probable es que las elimine en medio de una línea de salida, pero es una forma barata de obtener una pequeña parte de un archivo que de otro modo no se podría utilizar.

Ex.

C: \ más test.csv> test.txt 
^ C C: \ más test.txt
línea 1
línea 2
etc ...... C:\
usuario2041301
fuente
9

Bueno, esto lo hará , pero es tan rápido como parece (aproximadamente O (n * m), donde n es el número de líneas para mostrar ym es el número total de líneas en el archivo):

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

Donde "10" es el número de líneas que desea imprimir y "nombre de archivo" es el nombre del archivo.

brianary
fuente
6
+1 para una solución que le llevó más tiempo escribir que descargar un puerto de head.
Camilo Martin
1
Nota: ponga esta expresión entre corchetes - (expr) > out.txt- cuando envíe los resultados a un archivo, o solo obtendrá la última línea. O agregar - expr >> out.txt.
cz
9

Potencia Shell:

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

Get-Content C:\logs\result.txt -wait (monitor the tail)
Manuel Alves
fuente
Esta es la respuesta correcta, actualizada y relevante (a diferencia de cmd). Gracias.
cudacoder
7

Cuando use más + n de lo que Matt ya mencionó, para evitar pausas en archivos largos, intente esto:

más +1 myfile.txt> con

Cuando redirige la salida de más, no se detiene, y aquí redirige a la consola. De manera similar, puede redirigir a otro archivo como este sin pausas de más si ese es el resultado final deseado. Use> para redirigir al archivo y sobrescribirlo si ya existe, o >> para agregarlo a un archivo existente. (Puede usar cualquiera para redirigir a estafa.)

Luego
fuente
5

Get-content -Tail n file.txtcon powershell es lo único que se acerca tailen linux.

Lo Get-Content *filename* | Select-Object -last *n*sugerido anteriormente carga / analiza todo. No hace falta decir que no estaba contento con mi archivo de registro de 10 GB ... La -Tailopción comienza por el final del archivo.

Sebas
fuente
2

Si desea el comando head, una forma fácil de obtenerlo es instalar Cygwin. Entonces tendrás todas las herramientas de UNIX a tu disposición.

Si esa no es una buena solución, puede intentar usar Findstr y hacer una búsqueda del indicador de fin de línea.

Findstr en MSDN: http://technet.microsoft.com/en-us/library/bb490907.aspx

Zian Choy
fuente
2

Aquí hay un comando principal nativo rápido que le brinda las primeras 9 líneas en DOS.

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

Los primeros 2 caracteres de cada línea serán el número de línea.

Don4x
fuente
2

en PS intenta usar el comando:

Select -Last 1

Este comando también se puede canalizar.

Ejemplo para obtener la primera línea:

type .\out.txt | Select -Last 1

o para obtener la primera línea:

 type .\out.txt | Select -First 1
Gico
fuente
1

FWIW, para aquellos que sólo necesitan recortar un número indeterminado de registros del encabezado del archivo, más> funciona bien. Esto es útil solo para tener un archivo más pequeño para trabajar en las primeras etapas del desarrollo de algo.

user382459
fuente
1

No intenté extraer un rango, pero pude obtener una línea usando el siguiente comando de DOS:

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

Dado que la mayoría de los archivos contienen espacios, este comando extrae cada línea de todos los archivos LOG y básicamente los numera a partir de 1 para cada archivo. Los resultados numerados luego se canalizan al segundo FINDcomando que busca la línea etiquetada como número 6.

sergioPinheiro
fuente
1

Hay una headutilidad gratuita en esta página que puede utilizar. Aún no lo he probado.

JeffH
fuente
1
No estoy seguro de por qué se votó en contra. Se ejecuta exactamente como la utilidad principal de UNIX.
coson
1
Es un enlace de descarga. ¿Se supone que debe codificar con uuen el binario e incrustarlo en la respuesta?
GargantuChet
0
set /p line= < file.csv 
echo %line%

devolverá la primera línea de su archivo en cmd Windows en la variable% line%.

Sergey Orlov
fuente
0

Como respuesta contemporánea, si ejecuta Windows 10, puede usar el "Subsistema de Linux para Windows".

https://docs.microsoft.com/en-us/windows/wsl/install-win10

Esto le permitirá ejecutar comandos nativos de Linux desde Windows y, por lo tanto, ejecutar Tail exactamente como lo haría en Linux.

Alex KeySmith
fuente
-2

No creo que haya forma de salir de la caja. No existe tal comando en DOS y los archivos por lotes están muy limitados para simularlo (sin mayores problemas).

EricSchaefer
fuente
-2

Advertencia, el uso del archivo por lotes para, tokens y la capacidad delims en la entrada de texto desconocido puede ser un desastre debido a la interpretación especial de caracteres como &,!, <, Etc. Dichos métodos deben reservarse solo para texto predecible.

Advertencia de lote
fuente