Script batch CMD.EXE per visualizzare le ultime 10 righe da un file txt

Qualche idea su come echo o digitare le ultime 10 righe di un file txt?

Sto eseguendo uno script di registro delle modifiche del server per chiedere agli amministratori di indicare cosa stanno facendo, in modo che possiamo tenere traccia delle modifiche. Sto cercando di far sì che la sceneggiatura mostri le ultime 10 voci per dare un’idea di cosa è successo di recente. Ho trovato uno script che si occupa dell’ultima riga, come mostrato di seguito, ma non riesco a capire cosa cambiare in esso per visualizzare le ultime 10 righe. script:

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

Esempio di file di 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, 

qualche idea? Lo script funziona alla grande, serve solo a convogliare più linee sullo schermo.

Speriamo che questo salverà gli occhi di 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 

Questa risposta combina le migliori caratteristiche delle risposte già esistenti e aggiunge alcune svolte.

La soluzione è una semplice implementazione in batch del comando tail.

Il primo argomento è il nome del file (possibilmente con informazioni sul percorso – assicurati di racchiudere tra virgolette se una parte del percorso contiene spazi o altri caratteri problematici).

Il secondo argomento è il numero di righe da stampare.

Infine, è ansible aggiungere una qualsiasi delle opzioni standard MORE: / E / C / P / S / Tn. (Vedi ALTRO /? Per maggiori informazioni).

Inoltre, è ansible specificare l’opzione / N (nessuna pausa) per fare in modo che l’output venga stampato in modo continuo senza pause.

La soluzione utilizza innanzitutto TROVA per contare rapidamente il numero di linee. Il file viene passato tramite input reindirizzato anziché utilizzare un argomento filename per eliminare la stampa del nome file nell’output FIND.

Il numero di righe da saltare è calcolato con SET / A, ma poi reimposta il numero su 0 se è minore di 0.

Infine usa MORE per stampare le linee desiderate dopo aver saltato le linee indesiderate. MORE si interromperà dopo il valore delle righe di ogni schermata, a meno che l’output non venga reindirizzato a un file o inviato a un altro comando. L’opzione / N evita le pause collegando l’output MORE a FINDSTR con un’espressione regolare che corrisponde a tutte le righe. È importante utilizzare FINDSTR anziché FIND perché FIND può troncare le linee lunghe.

 :: 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% 

Probabilmente dovresti solo trovare una buona implementazione della tail . Ma se davvero insisti nell’usare i file batch CMD e vuoi eseguire su una macchina NT non molestata, questo funzionerà:

 @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! 

Esistono diverse implementazioni di Windows del comando tail. Dovrebbe essere esattamente quello che vuoi.

Questo suona particolarmente bene: http://malektips.com/xp_dos_0001.html

Vanno dal monitoraggio in tempo reale alle ultime x linee del file.

Edit: ho notato che il link incluso è per un pacchetto Dovrebbe funzionare, ma qui ci sono alcune altre versioni:

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

Se il file è troppo grande può richiedere troppo tempo per ottenere il conteggio delle righe un altro modo è quello di utilizzare find e passarlo una stringa da nessuna parte

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

questo risulterebbe in un risultato come questo

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

quindi puoi analizzare l’output usando per questo

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

quindi puoi sottrarre dieci linee dalle linee totali

Dopo aver provato tutte le risposte che ho trovato su questa pagina, nessuna di esse ha funzionato sul mio file con 15539 righe.

Tuttavia ho trovato la risposta qui per funzionare alla grande. Copiato in questo post per comodità.

 @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 

Questo codice stamperà le ultime 10 righe nel file "C: \ path \ to \ textfile.txt".

Il merito va a OP @ Peter Mortensen

utilizzando un singolo comando powershell:

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

si applica a PowerShell 3.0 e successivi

Sono d’accordo con la risposta “Dovresti usare TAIL”. Ma non viene di default su Windows. Ti suggerisco di scaricare il ” Resource Kit di Windows 2003 ” Funziona su XP / W2003 e altro ancora.

Se non si desidera installare sul proprio server, è ansible installare il kit di risorse su un altro computer e copiare TAIL.EXE sul proprio server. L’utilizzo è molto più semplice.

 C:\> TAIL -10 myfile.txt 

Ecco un programma di utilità scritto in puro batch che può mostrare linee di file all’interno di un determinato intervallo. Per mostrare l’uso delle ultime righe (qui lo script è denominato tailhead.bat):

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

Qualche idea su come echo o digitare le ultime 10 righe di un file txt?

Il seguente script 3-liner elencherà le ultime n righe dal file di input. n e il nome / percorso del file vengono passati come argomenti di input.

 # 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 

Lo script è in biterscripting. Per utilizzare, scaricare biterscripting da http://www.biterscripting.com , salvare questo script come C: \ Scripts \ last.txt, avviare biterscripting, immettere il seguente comando.

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

Quanto sopra elencherà le ultime 10 righe dal file c: \ log09.txt. Per elencare le ultime 20 righe dello stesso file, utilizzare il seguente comando.

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

Per elencare le ultime 30 righe da un diverso file C: \ folder1 \ somefile.log, utilizzare il seguente comando.

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

Ho scritto la sceneggiatura in un modo abbastanza generico, quindi può essere usata in vari modi. Sentiti libero di tradurre in un altro linguaggio di scripting / batch.