web-dev-qa-db-fra.com

Script de traitement par lots CMD.EXE pour afficher les 10 dernières lignes d'un fichier txt

Des idées comment faire écho ou taper les 10 dernières lignes d'un fichier txt?

J'exécute un script de journal de changement de serveur pour inciter les administrateurs à indiquer ce qu'ils font pour que nous puissions suivre les modifications. J'essaie de faire en sorte que le script affiche les 10 dernières entrées ou plus pour donner une idée de ce qui s'est passé récemment. J'ai trouvé un script qui traite de la dernière ligne, comme indiqué ci-dessous, mais je ne vois pas quoi changer pour afficher les 10 dernières lignes . Script:

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

Exemple de fichier journal:

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,

Avez-vous des idées? Le script fonctionne très bien, il vous suffit d’envoyer davantage de lignes à l’écran.

16
Matt Ball

Espérons que cela sauvera les yeux 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
17
Patrick Cuff

Cette réponse combine les meilleures caractéristiques des réponses existantes et ajoute quelques modifications.

La solution est une simple implémentation par lots de la commande tail.

Le premier argument est le nom du fichier (avec éventuellement des informations sur le chemin - assurez-vous de mettre entre guillemets si une partie du chemin contient des espaces ou d’autres caractères problématiques).

Le deuxième argument est le nombre de lignes à imprimer.

Enfin, toutes les options standard MORE peuvent être ajoutées:/E/C/P/S/Tn. (Voir MORE /? Pour plus d'informations).

De plus, l'option/N (sans pause) peut être spécifiée pour que la sortie soit imprimée en continu sans pause.

La solution utilise d'abord FIND pour compter rapidement le nombre de lignes. Le fichier est transmis via une entrée redirigée au lieu d'utiliser un argument de nom de fichier afin d'éliminer l'impression du nom de fichier dans la sortie FIND.

Le nombre de lignes à ignorer est calculé avec SET/A, mais il réinitialise le nombre à 0 s'il est inférieur à 0.

Utilise enfin MORE pour imprimer les lignes souhaitées après avoir ignoré les lignes indésirables. MORE mettra en pause après la valeur des lignes de chaque écran, sauf si la sortie est redirigée vers un fichier ou transmise à une autre commande. L'option/N évite les pauses en dirigeant la sortie MORE vers FINDSTR avec une expression régulière correspondant à toutes les lignes. Il est important d’utiliser FINDSTR au lieu de FIND car FIND peut tronquer de longues lignes.

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

Vous devriez probablement simplement trouver une bonne implémentation de tail. Mais si vous insistez vraiment sur l’utilisation des fichiers de commandes CMD et que vous voulez exécuter sur n’importe quelle machine NT, cela fonctionne:

@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!
10
Joel Spolsky

Après avoir essayé toutes les réponses trouvées sur cette page, aucune d’entre elles n’a fonctionné sur mon dossier avec 15539 lignes. 

Cependant, j'ai trouvé la réponse ici pour travailler très bien. Copié dans ce message pour plus de commodité.

@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

Ce code imprimera les 10 dernières lignes du fichier "C:\chemin\to\textfile.txt".

Le mérite en revient à l'OP @ Peter Mortensen 

4
Randy Rakestraw

Il existe plusieurs implémentations Windows de la commande tail. Cela devrait être exactement ce que vous voulez.

Celui-ci sonne particulièrement bien: http://malektips.com/xp_dos_0001.html

Ils vont de la surveillance en temps réel aux x dernières lignes du fichier.

Edit: J'ai remarqué que le lien inclus est vers un paquet Cela devrait fonctionner, mais voici quelques versions supplémentaires:

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

4
Phil

Si le fichier est trop volumineux, le comptage des lignes peut prendre trop de temps. 

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

cela donnerait une sortie comme celle-ci

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

alors vous pouvez analyser la sortie en utilisant pour comme ceci

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

alors vous pouvez soustraire dix lignes du total des lignes 

4
Hassan

en utilisant une seule commande powershell:

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

s'applique à Powershell 3.0 et plus récent

2
Eyal

Je suis d'accord avec "Vous devriez utiliser TAIL" réponse. Mais cela ne vient pas par défaut sous Windows. Je vous suggère de télécharger le " Kit de ressources Windows 2003 ". Il fonctionne sous XP/W2003 et plus.

Si vous ne souhaitez pas installer sur votre serveur, vous pouvez installer le kit de ressources sur un autre ordinateur et copier uniquement TAIL.EXE sur votre serveur. L'utilisation est tellement plus facile.

C:\> TAIL -10 myfile.txt
1
PollusB

Voici un utilitaire écrit en batch pur pouvant afficher une ligne de fichier dans une plage donnée. Pour afficher les dernières lignes utilisées (ici le script s'appelle tailhead.bat):

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

Toutes les idées comment faire écho ou tapez le dernier 10 lignes d'un fichier txt?

Le script à 3 lignes suivant listera les n dernières lignes du fichier d’entrée. n et le nom de fichier/chemin sont passés en tant qu'arguments d'entrée.

# 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

Le script est en biterscripting. Pour l'utiliser, téléchargez biterscripting à partir de http://www.biterscripting.com , enregistrez ce script sous C:\Scripts\last.txt, lancez biterscripting, entrez la commande suivante.

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

Ce qui précède liste les 10 dernières lignes du fichier c:\log09.txt. Pour répertorier les 20 dernières lignes du même fichier, utilisez la commande suivante.

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

Pour répertorier les 30 dernières lignes d’un fichier différent C:\folder1\somefile.log, utilisez la commande suivante.

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

J'ai écrit le script de manière assez générique, de sorte qu'il peut être utilisé de différentes manières. N'hésitez pas à traduire dans un autre langage de script/batch.

0
P M