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和更高版本)添加了别名为
还添加了
因此,命令可以重写为
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 =要显示的行数。运行速度很快,与
您可以从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的
上面建议的
您还可以在头部和尾部也被模拟的情况下使用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开始对其编号。然后将编号的结果传送到第二个
FWIW,对于那些只需要从文件头剪掉不确定数量的记录的人来说,more>效果很好。仅在开发某些早期阶段使用较小的文件时,这很有用。
您可以在此页面上使用免费的
作为一个现代的答案,如果运行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功能可能会造成灾难。此类方法仅应保留给可预测的文本。