Windows中类似于“tail”命令的等效命令

129

有没有办法在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

12
head 命令不是只显示前 n 行而不是忽略它们吗? - Joey
请Chris考虑自2009年以来的新答案,特别是Amit Portnoy的答案。由于您的问题很普遍,许多用户可能会找到这个网页。他们可能会在第一个答案之后停止阅读答案:您已经接受的答案。您可以将您已经接受的答案更改为另一个更符合现今可能性的答案。干杯;) - oHo
我有点困惑。原始问题是关于Unix风格的“head”命令,但期望的输出看起来像是想要“tail”。答案似乎是关于“head”,而不是“tail”。 - blakeoft
@blakeoft 原始问题询问的是 tail 的行为,但标题却说的是 head - M.M
在这个例子中,不清楚预期的命令是 *[call to tail]* 2 > result.txt,如果是这样,它等同于 tail,还是 *[call to tail]* 1 > result.txt,如果是后者,则不等同。 - sancho.s ReinstateMonicaCellio
22个回答

136

如果您安装了Windows PowerShell(我认为它从XP开始就包含在内),您可以直接从cmd.exe运行:

Head命令:

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及更高版本)添加了带有别名LastTail命令。 还添加了HeadFirst别名到TotalCount

因此,命令可以重新编写为

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

这个行为不是像tail而是像head吗? - blakeoft
1
@blakeoft 刚刚意识到问题已经被编辑了!(请参见stackoverflow.com/posts/1295068/revisions)。它最初只要求head命令...现在已更新为包括两个答案... - Amit Portnoy
2
@AmitPortnoy 我在此 Stack Exchange 的其他问题中发现另一个答案,该答案说 Get-Content 现在拥有 tail 命令。例如,Get-content -Tail 5 file.txt 将打印出 file.txt 的最后五行。顺便说一句感谢你更新你的答案。 - blakeoft
2
有没有办法将其用作过滤器?(例如,读取标准输入而不是文件) - eadmaster
我所知道的任何DOS系统都无法运行PowerShell。 - Andreas Rejbrand
显示剩余2条评论

103

没有完全的等价物。但是存在一个名为“more”的本机DOS命令,它有一个+n选项,可以在第n行后开始输出文件:

DOS提示符:

C:\>more +2 myfile.txt
上面的命令将输出第2行后的所有内容。
这实际上是Unix中head的反向操作:

Unix控制台:

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

上述命令将只打印文件的前两行。


12
不一样,tail 命令是从文件末尾开始计数的。因此,tail -2 将会打印出最后两行。 - ADTC
7
我能够协助您进行翻译。这句话的意思是:我能打印出前n个字符吗?请让我知道如何帮到您。 - Qwerty
@ADTC 我的版本的tail不支持负数,只有head支持(gnuwin32)。 - nl-x
@ADTC 对不起,我搞混了 head -n -2head -n 2,它们是不同的。但是在 tail 中,后者不存在。 - nl-x
@ADTC 大多数版本的 tail 命令也支持通过在数字前加上 + 来指定从文件顶部开始的行数。因此,针对上面的示例,要获取第二行之后的所有内容(例如第三行及其以下行),请使用 tail -n +3 命令。 - Ken Bellows
显示剩余2条评论

25
more /e filename.txt P n

n是要显示的行数。速度很快,与head命令完全相同。


18
命令(如P、S等)只能由用户在提示符处输入。它们不能传递给more命令。因此,上面的示例无法工作。 - Philibert Perusse

25

PowerShell:

Get-Content C:\logs\result.txt -Tail 10

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

4
这是正确的答案,时效性和相关性很高(与cmd不同)。 - guychouk
1
你也可以将它们结合起来使用: Get-Content c:\Logs\Results.txt -Tail 10 -wait 这将显示最后10行并等待新条目。 - Semperfi89

18

你可以从GnuWin32获取CoreUtils,它是一组标准的Unix工具,在Windows上移植而来。

其中包含head等工具。


13

这是一种极其简单粗暴的方法,但如果你想要仅仅查看一个巨大文件的格式、头部等信息,并且正在寻找解决方案,那么你可以将'more'输出重定向到新文件中并快速使用CTRL-C。输出行不能被精确地控制,你很可能会在输出的某一行中断,但这是获取原本无法使用的文件的一种廉价方法。

示例:

C:\more test.csv > test.txt 
^C
C:\more test.txt
line 1
line 2
etc......
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”是您想要打印的行数,“filename”是文件的名称。


6
对于一个解决方案,如果打字的时间比下载 'head' 的端口还要长,请给出+1。 - Camilo Martin
1
请注意:当将结果发送到文件时,请将此表达式括在括号中 - (expr) > out.txt - 否则您只会得到最后一行。或者附加 - expr >> out.txt - c z

8
使用Matt提到的more +n时,为避免在长文件中出现暂停,请尝试以下操作:
more +1 myfile.txt > con
当您将输出从more重定向时,它不会暂停 - 在此处,您将重定向到控制台。如果您想要的结果是避免more的暂停并将其重定向到其他文件,则可以像下面这样进行重定向。使用">"将其重定向到文件并覆盖该文件(如果已存在),或使用">>"将其追加到现有文件中。(都可以使用">"将其重定向到con。)

6

您还可以使用Git bash,其中头和尾也被模拟了。



5

Get-content -Tail n file.txt 是PowerShell中与Linux中的tail最相似的命令。

上面建议的Get-Content *filename* | Select-Object -last *n*会加载/解析整个文件。不用说,对于我的10GB日志文件来说这是不可行的... -Tail选项从文件末尾开始读取。


我不确定它是否从结尾开始,但是“-Tail”参数花费了几分钟时间才运行完一个“-Tail 100”的命令,直到我取消了它。该文件略低于800MB。 - Noman_1

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