Windows等同于’tail’命令

Windows equivalent of the 'tail' command

有没有办法在Windows命令行上模拟* nix tail命令? 我有一个文件,并且想要一种剪掉文本的前n行的方法。 例如:

1
2
3
4
5
6
7
8
9
D:\>type file.txt
line one
line two
line three
D:\>*[call to tail]* > result.txt

D:\>type result.txt
line two
line three


如果您安装了Windows PowerShell(我认为它是XP附带的),则可以从cmd.exe运行:

总指挥:

1
powershell -command"& {Get-Content *filename* -TotalCount *n*}"

尾命令:

1
powershell -command"& {Get-Content *filename* | Select-Object -last *n*}"

或者,直接从PowerShell:

1
2
Get-Content *filename* -TotalCount *n*
Get-Content *filename* | Select-Object -last *n*

更新

PowerShell 3.0(Windows 8和更高版本)添加了别名为LastTail命令。
还添加了TotalCountheadFirst别名。

因此,命令可以重写为

1
2
Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*


没有确切的等价物。但是,存在一个本机DOS命令"更多",它带有+ n选项,它将在第n行之后开始输出文件:

DOS提示:

1
C:\>more +2 myfile.txt

上面的命令将在前两行之后输出所有内容。
这实际上是Unix头的反面:

Unix控制台:

1
root@server:~$ head -2 myfile.txt

上面的命令将仅打印文件的前两行。


1
more /e filename.txt P n

其中n =要显示的行数。运行速度很快,与head命令完全一样。


您可以从GnuWin32获得CoreUtils,它是移植到Windows的标准unix工具的集合。

除其他外,它还包含头部。


这是一个完全的hack,但是如果它是一个巨大的文件,您只想检查格式,标题等,并且正在寻找解决方案,则可以始终将"更多"输出重定向到新文件并按CTRL-C很快。无法精确控制输出行,您很可能会在一行输出的中间将其杀死,但这是一种便宜的方法,可以获取一小部分原本无法使用的文件。

例如

1
2
3
4
5
C:\more test.csv > test.txt ^C

C:\more test.txt line 1line 2etc......

C:\

电源外壳:

1
2
3
4
5
Get-Content C:\logs
esult.txt -Tail 10

Get-Content C:\logs
esult.txt -wait (monitor the tail)


好吧,这可以做到,但是它的速度与外观差不多(大约O(n * m),其中n是要显示的行数,m是文件中的总行数):

1
for /l %l in (1,1,10) do @for /f"tokens=1,2* delims=:" %a in ('findstr /n /r"^" filename ^| findstr /r"^%l:"') do @echo %b

其中" 10"是要打印的行数,"文件名"是文件的名称。


当使用Matt已经提到的更多+ n时,为避免长文件中出现暂停,请尝试以下操作:

更多+1 myfile.txt> con

当您从更多目录重定向输出时,它不会暂停-在这里您可以重定向到控制台。如果您希望得到最终的结果,则可以类似地将其重定向到其他文件,而不需要更多的暂停。使用>重定向到文件并覆盖它(如果已存在),或使用>>附加到现有文件。 (可以使用任一重定向到con。)


具有powershell的Get-content -Tail n file.txt是Linux中唯一接近tail的东西。

上面建议的Get-Content *filename* | Select-Object -last *n*加载/解析整个内容。不用说,它对我的??10GB日志文件不满意... -Tail选项的确从文件末尾开始。


您还可以在头部和尾部也被模拟的情况下使用Git bash


如果需要head命令,一种简单的获取方法是安装Cygwin。然后,您将拥有所有UNIX工具。

如果这不是一个好的解决方案,那么您可以尝试使用findstr并搜索行尾指示符。

在MSDN上的findstr:http://technet.microsoft.com/en-us/library/bb490907.aspx


在PS中尝试使用命令:

1
Select -Last 1

此命令也可以通过管道传递。

获取第一行的示例:

1
type .\out.txt | Select -Last 1

或获得第一行:

1
 type .\out.txt | Select -First 1

这是一个快速的本地head命令,可为您提供DOS中的前9行。

1
findstr /n"." myfile.txt | findstr"^.:"

每行的前2个字符将是行号。


有一个资源工具包,可以从这里下载:http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displayLang=en

它包含一个tail.exe工具,但仅与某些Windows版本兼容

(摘自这篇文章:Windows的Tail命令)


我没有尝试提取范围,但是可以使用以下DOS命令获得一行:

1
find /N"" *.log|find"[6]"

由于大多数文件都包含空格,因此该命令从所有LOG文件中提取每一行,并基本上为每个文件从1开始对其编号。然后将编号的结果传送到第二个FIND命令中,该命令查找标记为数字6的行。


FWIW,对于那些只需要从文件头剪掉不确定数量的记录的人来说,more>效果很好。仅在开发某些早期阶段使用较小的文件时,这很有用。


您可以在此页面上使用免费的head实用程序。我还没有尝试过。


作为一个现代的答案,如果运行Windows 10,则可以使用" Windows的Linux子系统"。

https://docs.microsoft.com/zh-cn/windows/wsl/install-win10

这将允许您从Windows内部运行本机linux命令,从而以与在linux中完全相同的方式运行tail。


1
2
set /p line= < file.csv
echo %line%

它将在cmd Windows中以变量%line%返回文件的第一行。


我认为没有开箱即用的方法。在DOS中没有这样的命令,并且批处理文件远远不能用来模拟它(没有很大的麻烦)。


警告,由于对&,!,<等字符的特殊解释,对未知文本输入使用批处理文件的令牌和delims功能可能会造成灾难。此类方法仅应保留给可预测的文本。