it-swarm.com.ru

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

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

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

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

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

16
Matt Ball

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

@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

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

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

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

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

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

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

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

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

Наконец, использует БОЛЬШЕ, чтобы распечатать нужные строки после пропуска нежелательных строк. 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%
12
dbenham

Вы, вероятно, должны просто найти хорошую реализацию 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!
10
Joel Spolsky

Перепробовав все ответы, которые я нашел на этой странице, ни один из них не работал с моим файлом с 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".

Кредит идет в ОП @ Питер Мортенсен 

4
Randy Rakestraw

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

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

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

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

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

4
Phil

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

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

это приведет к такому выводу

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

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

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

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

4
Hassan

используя одну команду powershell:

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

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

2
Eyal

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

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

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

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

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

Любые идеи, как повторить или напечатать последний 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)

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

0
P M