Script por lotes CMD.EXE para mostrar las últimas 10 líneas de un archivo txt

¿Alguna idea de cómo hacer eco o escribir las últimas 10 líneas de un archivo txt?

Estoy ejecutando un script de registro de cambios del servidor para solicitarles a los administradores que digan lo que están haciendo, para que podamos rastrear los cambios. Intento que el guión muestre las últimas 10 entradas para dar una idea de lo que ha estado ocurriendo recientemente. Encontré una secuencia de comandos que trata de la última línea, como se muestra a continuación, pero no puedo imaginar qué cambiar en ella para mostrar las últimas 10 líneas. Guión:

@echo off setLocal EnableDelayedExpansion for /f "tokens=* delims= " %%a in (c:\log09.txt) do ( set var=%%a ) echo !var! 

Ejemplo de archivo de registro:

 06/02/2009, 12:22,Remote=Workstation-9,Local=, mdb,bouncing box after updates,CAS-08754, ================= 07/02/2009, 2:38,Remote=,Local=SERVER1, mdb,just finished ghosting c drive,CAS-08776, ================= 07/02/2009, 3:09,Remote=,Local=SERVER1, mdb,audit of server,CAS-08776, 

¿Alguna idea? El script funciona muy bien, solo lo necesita para canalizar más líneas a la pantalla.

Espero que esto salve los ojos de Joel 🙂

 @echo OFF :: Get the number of lines in the file set LINES=0 for /f "delims==" %%I in (data.txt) do ( set /a LINES=LINES+1 ) :: Print the last 10 lines (suggestion to use more courtsey of dmityugov) set /a LINES=LINES-10 more +%LINES% < data.txt 

Esta respuesta combina las mejores características de las respuestas ya existentes y agrega algunos giros.

La solución es una implementación por lotes simple del comando tail.

El primer argumento es el nombre del archivo (posiblemente con información de ruta: asegúrese de incluir entre comillas si alguna parte de la ruta contiene espacios u otros caracteres problemáticos).

El segundo argumento es el número de líneas para imprimir.

Finalmente, se puede agregar cualquiera de las opciones MÁS estándar: / E / C / P / S / Tn. (Ver MÁS /? Para más información).

Además, se puede especificar la opción / N (sin pausa) para provocar que la salida se imprima continuamente sin detenerse.

La solución primero usa FIND para contar rápidamente el número de líneas. El archivo se transfiere a través de una entrada redirigida en lugar de utilizar un argumento de nombre de archivo para eliminar la impresión del nombre de archivo en la salida FIND.

El número de líneas para omitir se calcula con SET / A, pero luego restablece el número a 0 si es menor que 0.

Finalmente usa MORE para imprimir las líneas deseadas después de omitir las líneas no deseadas. MORE hará una pausa después del valor de líneas de cada pantalla a menos que la salida se redirija a un archivo o se canalice a otro comando. La opción / N evita las pausas conectando la salida MORE a FINDSTR con una expresión regular que coincide con todas las líneas. Es importante utilizar FINDSTR en lugar de FIND porque FIND puede truncar líneas largas.

 :: tail.bat File Num [/N|/E|/C|/P|/S|/Tn]... :: :: Prints the last Num lines of text file File. :: :: The output will pause after filling the screen unless the /N option :: is specified :: :: The standard MORE options /E /C /P /S /Tn can be specified. :: See MORE /? for more information :: @echo OFF setlocal set file=%1 set "cnt=%~2" shift /1 shift /1 set "options=" set "noPause=" :parseOptions if "%~1" neq "" ( if /i "%~1" equ "/N" (set noPause=^| findstr "^") else set options=%options% %~1 shift /1 goto :parseOptions ) for /f %%N in ('find /c /v "" ^<%file%') do set skip=%%N set /a "skip-=%cnt%" if %skip% lss 0 set skip=0 more +%skip% %options% %file% %noPause% 

Probablemente deberías encontrar una buena implementación de tail . Pero si realmente insistes en usar archivos por lotes CMD y deseas ejecutar en cualquier máquina NT sin problemas, esto funcionará:

 @echo off setLocal EnableDelayedExpansion for /f "tokens=* delims= " %%a in (c:\tmp\foo.txt) do ( set var9=!var8! set var8=!var7! set var7=!var6! set var6=!var5! set var5=!var4! set var4=!var3! set var3=!var2! set var2=!var1! set var1=!var! set var=%%a ) echo !var9! echo !var8! echo !var7! echo !var6! echo !var5! echo !var4! echo !var3! echo !var2! echo !var1! echo !var! 

Hay varias implementaciones de Windows del comando tail. Debería ser exactamente lo que quieres.

Esto suena particularmente bueno: http://malektips.com/xp_dos_0001.html

Van desde la supervisión en tiempo real hasta las últimas x líneas del archivo.

Editar: noté que el enlace incluido es para un paquete. Debería funcionar, pero aquí hay algunas versiones más:

http://www.lostinthebox.com/viewtopic.php?f=5&t=3801 http://sourceforge.net/projects/tailforwin32

Si el archivo es demasiado grande, puede llevar demasiado tiempo contar las líneas de otra manera, es usar buscar y pasarlo a ninguna parte.

 $find /v /c "%%$%!" yourtextfile.txt 

esto daría como resultado una salida como esta

 $---------- yourtextfile.txt: 140 

entonces puedes analizar la salida usando para así

 $for /f "tokens=3" %i in ('find /v /c "%%$%!" tt.txt') do set countoflines=%i 

entonces puedes restar diez líneas del total de líneas

Después de probar todas las respuestas que encontré en esta página, ninguna de ellas funcionó en mi archivo con 15539 líneas.

Sin embargo, encontré la respuesta aquí para que funcione bien. Copiado en esta publicación por conveniencia.

 @echo off for /f %%i in ('find /v /c "" ^< C:\path\to\textfile.txt') do set /a lines=%%i set /a startLine=%lines% - 10 more /e +%startLine% C:\path\to\textfile.txt 

Este código imprimirá las últimas 10 líneas en el archivo "C: \ path \ to \ textfile.txt".

El crédito es para OP @ Peter Mortensen

usando un solo comando powershell:

 powershell -nologo "& "Get-Content -Path c:\logFile.log -Tail 10" 

se aplica a powershell 3.0 y más reciente

Estoy de acuerdo con la respuesta “Deberías usar TAIL”. Pero no viene por defecto en Windows. Sugiero que descargue el ” Kit de recursos de Windows 2003 ” Funciona en XP / W2003 y más.

Si no desea instalar en su servidor, puede instalar el kit de recursos en otra máquina y copiar solo TAIL.EXE a su servidor. El uso es mucho más fácil.

 C:\> TAIL -10 myfile.txt 

Aquí hay una utilidad escrita en lote puro que puede mostrar líneas de archivo dentro de un rango determinado. Para mostrar las últimas líneas use (aquí el script se llama tailhead.bat):

 call tailhead.bat -file "file.txt" -begin -10 

¿Alguna idea de cómo hacer eco o escribir las últimas 10 líneas de un archivo txt?

El siguiente script de 3 líneas mostrará las últimas n líneas del archivo de entrada. ny el nombre / ruta del archivo se pasan como argumentos de entrada.

 # Script last.txt var str file, content ; var int n, count cat $file > $content ; set count = { len -e $content } - $n stex -e ("["+makestr(int($count))) $content 

El script está en biterscripting. Para usar, descargue biterscripting desde http://www.biterscripting.com , guarde este script como C: \ Scripts \ last.txt, inicie biterscripting, ingrese el siguiente comando.

 script last.txt file("c:\log09.txt") n(10) 

Lo anterior mostrará una lista de las últimas 10 líneas del archivo c: \ log09.txt. Para enumerar las últimas 20 líneas del mismo archivo, use el siguiente comando.

 script last.txt file("c:\log09.txt") n(20) 

Para enumerar las últimas 30 líneas de un archivo diferente C: \ folder1 \ somefile.log, use el siguiente comando.

 script last.txt file("C:\folder1\somefile.log") n(30) 

Escribí el guión de una manera bastante genérica, por lo que puede usarse de varias maneras. Siéntase libre de traducir a otro lenguaje de scripting / batch.