相当于“ tail”命令的 Windows

有没有办法在 Windows 命令行上模拟 * nix 尾巴命令?我有一个文件,我想要一种方法来剪掉第一个 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
279330 次浏览

I don't think there is way out of the box. There is no such command in DOS and batch files are far to limited to simulate it (without major pain).

If you want the head command, one easy way to get it is to install Cygwin. Then you'll have all the UNIX tools at your disposal.

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

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

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

除了其他东西,它还含有人头。

这一页上有一个免费的 head实用程序,你可以使用。我还没有试过。

没有完全相同的。然而,存在一个本地 DOS 命令“ more”,它有一个 + n 选项,将在第 n 行之后开始输出文件:

DOS 提示:

C:\>more +2 myfile.txt

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

Unix console:

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

上面的命令将只打印文件的前2行。

当使用更多 Matt 已经提到的 + n 时,为了避免在长文件中出现停顿,可以尝试这样做:

更多 + 1 myfile.txt > con

当您从 more 重定向输出时,它不会暂停-在这里您将重定向到控制台。如果这是您想要的最终结果,您也可以类似地将 more 的暂停重定向到其他类似于这样的文件。使用 > 重定向到 file 并覆盖它(如果它已经存在) ,或使用 > > 附加到现有文件。(可以使用其中一个重定向到 con。)

好吧,这将 它,但是它大约像它看起来一样快(大约 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”是文件的名称。

警告,对未知文本输入使用批处理文件、标记和分隔符功能可能是一场灾难,因为对 & 、 !等。这样的方法应该只保留给可预测的文本。

我没有尝试提取一个范围,但是我能够使用以下 DOS 命令得到一行:

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

因为大多数文件都包含空格,所以这个命令从所有日志文件中提取每一行,并且基本上从每个文件的1开始对它们进行编号。然后,编号的结果通过管道传输到第二个 FIND命令,该命令查找标记为编号6的行。

FWIW,对于那些只需要从文件头中剪切不确定数量的记录的人来说,更多工作得很好。这对于在开发的早期阶段使用较小的文件非常有用。

more /e filename.txt P n

where n = the number of rows to display. Works fast and is exactly like head command.

如果 你已经安装了 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及更高版本)添加了别名为 LastTail命令。 HeadFirst别名也添加到 TotalCount

因此,可以将命令重写为

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

这是一个完全的技巧,但如果它是一个巨大的文件,你只是想检查格式,标题等,你正在寻找一个解决方案,你总是可以重定向的‘ more’输出到一个新的文件和 CTRL-C 快速。输出行无法被精确控制,而且很可能会在输出行的中间被终止,但这是获取一小部分不可用文件的廉价方法。


C:\more test.csv > test.txt 
^C C:\more test.txt
line 1
line 2
etc...... C:\

下面是一个快速的本机 head 命令,它为您提供了 DOS 中的前9行。

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

每行的前两个字符是行号。

你也可以使用 Git bash模拟头部和尾部

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

它包含一个 tail.exe 工具,但是只能与一些 Windows 版本兼容

(复制自本文: 窗口的尾部命令)

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

上面建议的 Get-Content *filename* | Select-Object -last *n*负载/解析整个过程。不用说,它对我的10GB 日志文件并不满意... ... -Tail选项确实在文件结束时开始。

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

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

Powershell:

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


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

作为一个现代的答案,如果运行 Windows10,你可以使用“ Linux 子系统为 Windows”。

Https://learn.microsoft.com/en-us/windows/wsl/install-win10

这将允许您在 windows 中运行本机 linux 命令,从而像在 linux 中一样运行 tail。

in PS try to use command:

Select -Last 1

这个命令也可以通过管道传输。

获取第一行的示例:

type .\out.txt | Select -Last 1

或者得到第一句台词:

 type .\out.txt | Select -First 1

To keep the 1st few lines of text (head):

set n=<lines>
for /l %a in (1,1,%n%) do (
for /f "tokens=*" %i in ('find /v /n "" ^< test1.txt ^| find "[%a]"') do (
REM ove prefixed line numbers:
set a=%i
set a=!a:*]=!
echo:!a!)
)

丢弃文本(尾部)的前几行:

set n=<lines>
set file=<file.txt>
set /a n=n+1 >nul
for /f "tokens=*" %i in ('find /v /c "" ^< %file%') do set total=%i
for /l %a in (%n%,1,%total%) do (
for /f "tokens=*" %i in ('find /v /n "" ^< %file% ^| find "[%a]"') do (
REM ove prefixed line numbers:
set a=%i
set a=!a:*]=!
echo:!a!)
)

注:
The head function can also be achieved by fsutil
通过 fccomp也可以实现尾部功能

在 Win 10 cmd 上测试