首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于显示txt文件中最后10行的CMD.EXE批处理脚本

用于显示txt文件中最后10行的CMD.EXE批处理脚本
EN

Stack Overflow用户
提问于 2009-02-07 05:04:47
回答 8查看 88.5K关注 0票数 18

你知道如何回显或输入txt文件的最后10行吗?

我正在运行一个服务器更改日志脚本来提示管理员说明他们正在做什么,这样我们就可以跟踪更改。我正在尝试让脚本显示最后10个条目,以了解最近发生了什么。我找到了一个处理最后一行的脚本,如下所示,但不知道如何修改它来显示最后10行。脚本:

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

日志文件示例:

代码语言:javascript
复制
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,

有什么想法吗?该脚本工作得很好,只需要它管道更多的线到屏幕上。

EN

回答 8

Stack Overflow用户

发布于 2009-02-07 15:47:47

希望这能挽救Joel的眼睛:)

代码语言:javascript
复制
@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
票数 18
EN

Stack Overflow用户

发布于 2012-02-13 03:32:58

这个答案结合了现有答案的最佳功能,并添加了一些曲折。

解决方案是对tail命令进行简单的批处理实现。

第一个参数是文件名(可能带有路径信息-如果路径的任何部分包含空格或其他有问题的字符,请务必用引号括起来)。

第二个参数是要打印的行数。

最后,可以附加任何标准的MORE选项: /E /C /P /S /Tn。(请参阅更多/?了解更多信息)。

此外,还可以指定/N (无暂停)选项,以便连续打印输出,而不会暂停。

该解决方案首先使用FIND快速计算行数。该文件通过重定向输入传入,而不是使用filename参数,以便在FIND输出中消除文件名的打印输出。

使用SET /A计算要跳过的行数,但如果行数小于0,则将其重置为0。

最后使用MORE在跳过不需要的行后打印出所需的行。除非将输出重定向到文件或通过管道传输到另一个命令,否则将在每个屏幕的行数之后暂停更多内容。/N选项通过使用匹配所有行的正则表达式将更多输出输送到FINDSTR来避免暂停。使用FINDSTR而不是FIND很重要,因为FIND可以截断较长的行。

代码语言:javascript
复制
:: 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
EN

Stack Overflow用户

发布于 2009-02-07 06:30:22

您可能只需要找到一个很好的tail实现。但是如果你真的坚持使用CMD批处理文件,并且想要在任何NT机器上运行,这是可行的:

代码语言:javascript
复制
@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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/523181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档