Windows中类似Unix的tail命令是什么?

504

我正在寻找类似于Unix 'tail'命令的工具,可以在日志文件被写入时观看其输出。


1
实际上,XP是有tail命令的,只是微软没有在标准版XP中安装它;他们将它打包在“Windows Server 2003资源工具包”中。您可以在此处获取它:http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en - Matt Poush
1
不完全是重复的,但请参见此处:https://dev59.com/t3VC5IYBdhLWcg3wliKe - Martin Beckett
7
我认为这个应该没有被关闭,因为我需要同样的东西来调试我的Windows应用程序中的跟踪。它涉及到“程序员常用的软件工具”,是相关主题。 - kristianp
1
投票重新开放;这个问题是有关主题的,但是被关闭只是因为没有对答案达成普遍共识;SO的格式专门设计用来“找到”那个共识。 - Anne Quinn
1
在我看来,这似乎是一个非常合理的问题...实际上,这是我谷歌搜索“Windows tail log”时的第一个结果。 - Simon Dowdeswell
显示剩余7条评论
26个回答

617

如果你使用PowerShell,那么这个会起作用:

Get-Content filenamehere -Wait -Tail 30

为了让大家不错过,这里转载 Stefan 的评论:

PowerShell 3 引入了一个 -Tail 参数,可以只包含最后的 x 行。


14
实际上这不是动态的。 - Jey Geethan
17
这些信息很有用,感谢。但我在使用它时遇到了几个问题(在Windows 7上)。 (1)它会显示整个文件(对于大型日志文件不好,这就是为什么“tail”可能很有用)(2)它不够动态(可能是由于我的设置与其他帖子之间的操作系统/文件系统更改引起的?)。也就是说,我发现执行“Get-Content”的shell有时不会更新,除非我在另一个shell中运行“dir”。 - mpontillo
11
值得一提的是,PowerShell会在你在终端窗口中选择某些内容时暂停滚动/输出,以便让您有机会阅读、复制/粘贴等操作。如果按下回车键,它将恢复滚动。 - cbednarski
21
PowerShell 3 引入了一个“-Tail”参数,可以仅包含最后 x 行。 - Stefan Haberl
9
那么对于Powershell来说,正确答案不应该是类似于 Get-Content -Tail 100 -Wait .\logfile.log 这样的吗? - Henno Vermeulen
显示剩余16条评论

148

5
我刚试着在一个2GB的文件上使用GNU的 tail 命令,但是它卡住了。more 命令正常运行(至少能查看文件开头部分)。 - Eric J.
@EricJ.,我也是一样。在一个3GB的文件上,我可以使用head命令,但无法使用tail命令...有什么想法吗? - Alphaaa
@Alphaaa:我怀疑这与GNU工具使用的操作系统调用有关。请参见https://dev59.com/U1HTa4cB1Zd3GeqPQlrD#4003487。 - Eric J.
我在Windows 7上尝试了它,但是出现了“zsh:command not found tail”的错误。 - Black
1
我认为这里有一个更好的解决方案:https://dev59.com/rm855IYBdhLWcg3wSiQ7 - Dung
显示剩余2条评论

78

我一直在Windows上使用Baretail来进行日志追踪。它是免费的,而且非常好用。


这最终成为了我在 [gulp] Windows Server 2003 R2 SP1 上成功的第一个解决方案!安装程序非常简单,开箱即可轻松使用尾随功能 :) - cellepo
通过HTTP下载和执行未签名的可执行文件可能不是一个好主意。至少,应该通过他们的HTTPS网站进行下载。 - Zero3
2
我觉得很惊奇,他们一直在维护网站并更新SSL证书,而软件自2006年以来就没有升级。尽管如此,它仍然可以正常工作。这正是我所需要的。Windows Defender没有发现任何威胁。 - Lionet Chen
太棒了,我的朋友,我记不起这个名字了。 :) - gds03

34
您可以在Cygwin中获取tail。

29

有没有人对使用批处理命令(见下文)进行CMD尾部操作感兴趣。

它不是完美的,有时会重复行。

用法:tail.bat -d        tail.bat -f -f

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
rem tail.bat -d <lines> <file>
rem tail.bat -f <file>

rem ****** MAIN ******
IF "%1"=="-d" GOTO displayfile
IF "%1"=="-f" GOTO followfile

GOTO end

rem ************
rem Show Last n lines of file
rem ************

:displayfile
SET skiplines=%2
SET sourcefile=%3

rem *** Get the current line count of file ***
FOR /F "usebackq tokens=3,3 delims= " %%l IN (`find /c /v "" %sourcefile%`) DO (call SET find_lc=%%l)

rem *** Calculate the lines to skip
SET /A skiplines=%find_lc%-!skiplines!

rem *** Display to screen line needed
more +%skiplines% %sourcefile%

GOTO end

rem ************
rem Show Last n lines of file & follow output
rem ************

:followfile
SET skiplines=0
SET findend_lc=0
SET sourcefile=%2

:followloop
rem *** Get the current line count of file ***
FOR /F "usebackq tokens=3,3 delims= " %%l IN (`find /c /v "" %sourcefile%`) DO (call SET find_lc=%%l)
FOR /F "usebackq tokens=3,3 delims= " %%l IN (`find /c /v "" %sourcefile%`) DO (call SET findend_lc=%%l)

rem *** Calculate the lines to skip
SET /A skiplines=%findend_lc%-%find_lc%
SET /A skiplines=%find_lc%-%skiplines%

rem *** Display to screen line when file updated
more +%skiplines% %sourcefile%

goto followloop

:end

这很聪明,我非常支持在无法下载工具时利用现有功能!但是这段代码会消耗CPU资源,因为它将不断旋转以进行跟进操作。 - armstrhb
1
下载时遇到了相同的问题,而且CPU占用率很高!在“goto followloop”之前添加了这一行代码“ping 127.0.0.1 -n 2 > nul”,它会发送两个ping并等待1秒钟。这样就可以让CPU得以休息啦!:D - Mohsen ZareZardeyni
太棒了!非常感谢。 - John Fairbanks
2
为什么要使用ping,如果你可以使用“timeout /t 2”呢? - namezero

26

有很多选择,但它们都有一些缺陷并且更高级的功能存在问题。

  • GnuWin32 tail 有缺陷(α β γ),例如 -f 功能根本不起作用。

  • UnxUtils tail 似乎更好(-f 功能有效,但 --pid 似乎不行,-n 但没有--lines=n 不支持 -f),但似乎是一个不再维护的项目。

  • Cygwin 是一个庞大而丑陋的混杂物,也许可以只使用 DLL 和 coreutils 软件包 - 但仍然存在诸如 --pid 与本地 win32 进程不兼容的问题。


我创建了一个 GitHub 项目,其中包含了仅必要的 Cygwin 二进制文件以获取 tail 而无需安装。请访问 https://github.com/JavaScriptDude/cygtail 。如果您有任何问题,请尝试在我的存储库中发表评论。 - Timothy C. Quinn

22

如果您不想安装任何东西,您可以使用标准Windows命令“构建自己”的批处理文件来完成工作。以下是如何操作的一些提示。

1)使用find /c /v "" yourinput.file,获取输入文件中行数的数量。输出类似于:

---------- T.TXT: 15

2) 使用 for /f 命令解析此输出以获取数字 15。

3) 使用 set /a 命令计算需要跳过的标题行数。

4) 使用 for /f "skip=n" 命令跳过标题行,并回显/处理尾行。

如果我有时间,我将构建这样一个批处理文件并在此处发布。

编辑:tail.bat

REM tail.bat
REM
REM Usage: tail.bat <file> <number-of-lines> 
REM
REM Examples: tail.bat myfile.txt 10
REM           tail.bat "C:\My File\With\Spaces.txt" 10

@ECHO OFF
for /f "tokens=2-3 delims=:" %%f in ('find /c /v "" %1') do (
    for %%F in (%%f %%g) do set nbLines=%%F )
set /a nbSkippedLines=%nbLines%-%2
for /f "usebackq skip=%nbSkippedLines% delims=" %%d in (%1) do echo %%d

5
这是前面解释的一批内容,它显示当前文件的最后10行: ____ 使用 for /f "tokens=3" %%f in ('find /c /v "" %0') do set nbLines=%%f 来获取文件总行数。 ____ 计算要跳过的行数,使用 set /a nbSkippedLines=%nbLines%-10。 ____ 使用 for /f "skip=%nbSkippedLines% delims=" %%d in (%0) do echo %%d 显示文件的最后10行。 - Nicolas
2
这正是海报想要的,而且它完美地工作。 - Jackie Yeh
感谢您提供的代码!我已将其添加到答案中,并更正了参数数量并增加了一行。请注意,它将显示行并退出。附注:我用它来追踪一个1.5GB的文件,并在短短15秒内得到了结果。 - Leopoldo Sanczyk
实际上,在第4步,我认为最好使用带有参数的“more”命令来跳过行数。我觉得这样会更快。 - Philibert Perusse

20

通过 Windows PowerShell,您可以使用:

Get-Content <file> -Wait

19
我用过 Tail For Windows。虽然不像使用
tail
一样优雅,但毕竟你在使用Windows。;)

我也推荐使用Windows版的Tail。我喜欢它,因为我可以在同一个窗口中打开和监视多个文件。 - Paul
如果你使用的是 Posh 1 或 Posh 2.x,那么 Powershell 的 gc -tail 方法将无法工作。gc -tail 功能是在 Posh 3.0 中添加的。 - user1390375

15

在这里的回答中,我没有看到任何关于Log Expert的内容。

它是可定制的,非常适合浏览日志文件。到目前为止,这是我使用过的最好的Windows图形化日志查看器。

不幸的是,这个软件已经不再提供。您可以在archive.org上阅读有关它的信息。


我喜欢Log Expert的功能,但是在Win 7 64位上使用它的体验很不稳定。 - Clay
我想要“清晰视图”功能。 - Daniel Hári

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接