Windows等同于'tail'命令


107

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

D:\>type file.txt
line one
line two
line three
D:\>*[call to tail]* > result.txt

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

10
是否head仅显示前n行而不是将其遗漏?
乔伊(Joey)

请克里斯考虑一下自2009年以来的新答案,尤其是阿米特·波特诺伊的答案。由于您的问题很笼统,因此许多用户都可以找到此网页。并且他们可能会在第一个答案之后停止阅读答案:您已接受的答案。您可以将您接受的答案更改为当今更新的其他答案。干杯;)
olibre

我有点困惑。最初的问题是关于Unix样式的head命令,但是所需的输出看起来像是想要的tail。看来答案是关于head而不是tail
blakeoft

@blakeoft,最初的问题是询问的行为tail,但标题说的是head
MM

Answers:


89

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

DOS提示:

C:\>more +2 myfile.txt

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

Unix控制台:

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

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


8
不,不一样。tail从文件末尾开始计数。这样,tail -2将打印最后两行。
ADTC

5
我也可以打印前n个字符吗?
Qwerty 2014年

@ADTC(我的版本)不支持底片。只有头会(gnuwin32)
nl-x

@ nl-x -2不是负数。这只是-n 2(行数)的简写形式。不幸的是,太多的实现tail不支持-2,这使其与随附的head实现非常不一致。这使我很烦恼了很多次。
ADTC '16

@ADTC抱歉。我很困惑与head -n -2哪个不同head -n 2。但是有尾巴,后者不存在。
nl-x

111

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

总指挥:

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

尾命令:

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

或者,直接从PowerShell:

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


更新

PowerShell 3.0(Windows 8及更高版本)添加了Tail带有别名的命令LastHeadFirst别名也TotalCount被添加。

因此,命令可以重写为

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

head不是像tail吗?
blakeoft 2015年

@blakeoft是的。。。我已经更新了答案。令人惊讶的是,在有人对此发表评论之前,它花了2年零17票。
阿米特·波特诺伊,2015年

@blakeoft刚刚意识到问题已被编辑!(请参阅stackoverflow.com/posts/1295068/revisions)。它最初要求head命令...已更新为包括两个答案...
Amit Portnoy

2
@AmitPortnoy我在这个堆栈交换的某个地方找到了另一个答案,说现在Get-Content有一个tail命令。例如,Get-content -Tail 5 file.txt将打印file.txt的最后五行。谢谢您更新您的答案。
blakeoft 2015年

2
有什么办法将其用作过滤器?(例如,读取标准输入而不是文件)
eadmaster 2016年

24
more /e filename.txt P n

其中n =要显示的行数。工作迅速,与head命令完全一样。


14
诸如P,S等的命令只能由用户在提示符下输入。它们不能传递给more命令。因此,上面的示例不起作用
Philibert Perusse 2012年


12

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

例如

C:\ more test.csv> test.txt 
^ C C:\ more test.txt
第1
行第2行
等... C:\

9

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

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”是要打印的行数,“文件名”是文件名。


6
+1解决方案比下载端口花费的时间更长head
卡米洛·马丁

1
注意:(expr) > out.txt在将结果发送到文件时,请将此表达式放在方括号-中,否则只会得到最后一行。或追加- expr >> out.txt
cz


7

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

更多+1 myfile.txt> con

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



5

Get-content -Tail n file.txttail在Linux中,具有powershell的功能是唯一接近的。

Get-Content *filename* | Select-Object -last *n*上述建议的加载/解析了整个事情。不用说,它对我的​​10GB日志文件不满意...该-Tail选项确实在文件末尾开始。



2

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

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

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



2

在PS中尝试使用命令:

Select -Last 1

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

获取第一行的示例:

type .\out.txt | Select -Last 1

或获得第一行:

 type .\out.txt | Select -First 1

1

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


1

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

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

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


1

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


1
不知道为什么这被否决了。它的执行与UNIX head实用程序完全相同
coson 2012年

1
这是一个下载链接。他是否应该对二进制文件进行uuencode编码并将其嵌入答案中?
GargantuChet



-2

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


-2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.