Пакетный скрипт CMD.EXE для отображения последних 10 строк из текстового файла - PullRequest
17 голосов
/ 07 февраля 2009

Есть идеи, как отобразить или набрать последние 10 строк текстового файла?

Я запускаю скрипт журнала изменений сервера, чтобы администраторы могли указать, что они делают, чтобы мы могли отслеживать изменения. Я пытаюсь заставить скрипт показать последние 10 записей или около того, чтобы дать представление о том, что происходило в последнее время. Я нашел скрипт, который работает с последней строкой, как показано ниже, но не может понять, что в нем изменить, чтобы отобразить последние 10 строк. Сценарий:

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

Пример файла журнала:

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,

Есть мысли? Скрипт отлично работает, просто нужно, чтобы на экран выводилось больше строк.

Ответы [ 10 ]

18 голосов
/ 07 февраля 2009

Надеюсь, это спасет глаза Джоэла :) 1001 *

@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
12 голосов
/ 12 февраля 2012

Этот ответ объединяет в себе лучшие черты уже существующих ответов и добавляет несколько поворотов.

Решение представляет собой простую пакетную реализацию команды tail.

Первым аргументом является имя файла (возможно, с информацией о пути - обязательно заключите в кавычки, если какая-либо часть пути содержит пробелы или другие проблемные символы).

Второй аргумент - количество строк для печати. ​​

Наконец, можно добавить любой из стандартных параметров БОЛЬШЕ: / E / C / P / S / Tn. (Для получения дополнительной информации см. БОЛЬШЕ /?).

Кроме того, можно указать параметр / N (без паузы), чтобы вывод печатался непрерывно без остановки.

Решение сначала использует FIND для быстрого подсчета количества строк. Файл передается через перенаправленный ввод вместо использования аргумента имени файла, чтобы исключить распечатку имени файла в выводе FIND.

Число пропускаемых строк вычисляется с помощью SET / A, но затем оно сбрасывает число в 0, если оно меньше 0.

Наконец использует MORE для распечатки нужных строк после пропуска ненужных строк. MORE будет приостанавливаться после каждой строки на экране, если вывод не будет перенаправлен в файл или передан другой команде. Параметр / N позволяет избежать пауз, передавая вывод MORE в FINDSTR с помощью регулярного выражения, которое соответствует всем строкам. Важно использовать FINDSTR вместо FIND, потому что FIND может обрезать длинные строки.

:: 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%
10 голосов
/ 07 февраля 2009

Вероятно, вы должны просто найти хорошую реализацию tail. Но если вы действительно настаиваете на использовании командных файлов CMD и хотите работать на любой NT-машине, не имеющей права доступа, это сработает:

@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!
4 голосов
/ 14 августа 2015

После проверки всех ответов, которые я нашел на этой странице, ни один из них не работал с моим файлом с 15539 строками.

Однако я нашел ответ здесь , чтобы он отлично работал. Скопировано в этот пост для удобства.

@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

Этот код напечатает последние 10 строк в файле "C: \ path \ to \ textfile.txt".

Кредит поступает в ОП @Peter Mortensen

4 голосов
/ 17 марта 2009

Если файл слишком большой, получение количества строк может занять слишком много времени Другой способ - использовать строку find и передавать ее в никуда.

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

это приведет к выводу, подобному этому

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

тогда вы можете проанализировать вывод, используя для этого

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

тогда вы можете вычесть десять строк из общего количества строк

4 голосов
/ 07 февраля 2009

Существует несколько реализаций окон команды tail. Это должно быть именно то, что вы хотите.

Это звучит особенно хорошо: http://malektips.com/xp_dos_0001.html

Они варьируются от мониторинга в режиме реального времени до последних x строк файла.

Редактировать: я заметил, что включенная ссылка на пакет должен работать, но вот еще несколько версий:

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

2 голосов
/ 18 марта 2015

с помощью одной команды powershell:

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

относится к powershell 3.0 и новее

1 голос
/ 21 января 2016

Здесь - утилита, написанная в чистом пакетном режиме, которая может показать строки файла в заданном диапазоне. Для отображения последних использованных строк (здесь скрипт называется tailhead.bat ):

call tailhead.bat -file "file.txt" -begin -10
1 голос
/ 23 ноября 2012

Я согласен с ответом «Вы должны использовать хвост». Но это не приходит по умолчанию в Windows. Я предлагаю вам загрузить « Windows 2003 Resource Kit ». Он работает на XP / W2003 и более.

Если вы не хотите устанавливать на свой сервер, вы можете установить набор ресурсов на другой компьютер и скопировать только TAIL.EXE на ваш сервер. Использование оооочень намного проще.

C:\> TAIL -10 myfile.txt
0 голосов
/ 14 июля 2009

Любые идеи, как повторить или набрать последний 10 строк текстового файла?

Следующий 3-строчный скрипт выведет последние n строк из входного файла. n и имя файла / путь передаются в качестве входных аргументов.

# 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

Скрипт в битрейскрипте. Чтобы использовать, загрузите битерскрипт с http://www.biterscripting.com, сохраните этот скрипт как C: \ Scripts \ last.txt, запустите битрейскриптинг, введите следующую команду.

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

Выше будут перечислены последние 10 строк из файла c: \ log09.txt. Чтобы вывести последние 20 строк из одного и того же файла, используйте следующую команду.

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

Чтобы вывести последние 30 строк из другого файла C: \ folder1 \ somefile.log, используйте следующую команду.

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

Я написал сценарий довольно общим образом, поэтому его можно использовать по-разному. Не стесняйтесь переводить на другой язык сценариев / пакетной обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...