如何回显或输入txt文件的最后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,
有什么想法? 该脚本运行良好,只需要将更多行传输到屏幕上。
答案 0 :(得分:17)
希望这会拯救乔尔的眼睛:)。
@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
答案 1 :(得分:12)
这个答案结合了现有答案的最佳功能,并添加了一些曲折。
解决方案是tail命令的简单批处理实现。
第一个参数是文件名(可能带有路径信息 - 如果路径的任何部分包含空格或其他有问题的字符,请务必用引号括起来。)
第二个参数是要打印的行数。
最后可以附加任何标准的MORE选项:/ E / C / P / S / Tn。 (有关更多信息,请参阅更多/?)。
此外,可以指定/ N(无暂停)选项,以便在不暂停的情况下连续打印输出。
解决方案首先使用FIND快速计算行数。该文件通过重定向输入而不是使用filename参数传入,以消除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%
答案 2 :(得分:10)
您应该只是找到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!
答案 3 :(得分:4)
tail命令有几个windows实现。它应该是你想要的。
这个听起来特别好: http://malektips.com/xp_dos_0001.html
它们的范围从实时监控到文件的最后x行。
编辑:我注意到包含的链接是一个包它应该可以工作,但这里有更多的版本:
http://www.lostinthebox.com/viewtopic.php?f=5&t=3801 http://sourceforge.net/projects/tailforwin32
答案 4 :(得分:4)
如果文件太大,计算行数可能需要很长时间 另一种方法是使用find并传递一个无处字符串
$find /v /c "%%$%!" yourtextfile.txt
这会产生像这样的输出
$---------- yourtextfile.txt: 140
然后您可以使用for this解析输出
$for /f "tokens=3" %i in ('find /v /c "%%$%!" tt.txt') do set countoflines=%i
然后你可以从总行中减去十行
答案 5 :(得分:2)
使用单个powershell命令:
powershell -nologo "& "Get-Content -Path c:\logFile.log -Tail 10"
适用于powershell 3.0及更新版
答案 6 :(得分:1)
我同意“你应该使用TAIL”的答案。但它在Windows上默认不会出现。我建议你下载“Windows 2003 Resource Kit”它适用于XP / W2003等等。
如果您不想在服务器上安装,可以在另一台计算机上安装资源工具包,并仅将TAIL.EXE复制到您的服务器。用法太容易了。
C:\> TAIL -10 myfile.txt
答案 7 :(得分:1)
Here是一个用纯批处理编写的实用程序,它可以显示给定范围内的一行文件。显示最后一行使用(这里的脚本名为tailhead.bat):
call tailhead.bat -file "file.txt" -begin -10
答案 8 :(得分:0)
任何想法如何回声或输入最后一个 10行的txt文件?
以下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
脚本是biterscripting。要使用,请从http://www.biterscripting.com下载biterscripting,将此脚本保存为C:\ Scripts \ last.txt,启动biterscripting,输入以下命令。
script last.txt file("c:\log09.txt") n(10)
以上将列出文件c:\ log09.txt中的最后10行。要列出同一文件中的最后20行,请使用以下命令。
script last.txt file("c:\log09.txt") n(20)
要列出来自不同文件C:\ folder1 \ somefile.log的最后30行,请使用以下命令。
script last.txt file("C:\folder1\somefile.log") n(30)
我以相当通用的方式编写脚本,因此可以以各种方式使用它。随意翻译成另一种脚本/批处理语言。