有没有办法在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
答案 0 :(得分:101)
IF 你安装了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
命令,别名为Last
。
还添加了Head
和First
TotalCount
别名。
因此,命令可以重写为
Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*
答案 1 :(得分:80)
没有确切的等价物。但是,存在一个本机DOS命令“more”,它有一个+ n选项,将在第n行之后开始输出文件:
DOS提示符:
C:\>more +2 myfile.txt
上面的命令将输出前两行之后的所有内容 这实际上是Unix head 的反转:
Unix控制台:
root@server:~$ head -2 myfile.txt
上面的命令只会打印文件的前两行。
答案 2 :(得分:24)
more /e filename.txt P n
其中n =要显示的行数。工作得很快,就像head
命令一样。
答案 3 :(得分:17)
答案 4 :(得分:12)
这是一个彻底的黑客,但如果它是一个巨大的文件,你只想检查格式,标题等,你正在寻找一个解决方案,你总是可以将'more'输出重定向到一个新的文件, CTRL-C很快。输出行无法精确控制,你最有可能在输出行的中间将其删除,但它是一种廉价的方法来获取一小部分无法使用的文件。
实施例
C:\more test.csv > test.txt
^C C:\more test.txt
line 1
line 2
etc...... C:\
答案 5 :(得分:7)
当使用Matt已经提到的更多+ n时,为了避免长文件中的暂停,试试这个:
more +1 myfile.txt> CON
当您从更多位置重定向输出时,它不会暂停 - 在此处您将重定向到控制台。您可以类似地重定向到其他文件,如果这是您想要的最终结果,则暂停更多。使用>重定向到文件并覆盖它(如果它已经存在),或者>>附加到现有文件。 (可以使用任一方式重定向到con。)
答案 6 :(得分:7)
嗯,这将做它,但它的速度和它看起来一样快(大致为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”是文件的名称。
答案 7 :(得分:5)
Powershell的:
Get-Content C:\logs\result.txt -Tail 10
Get-Content C:\logs\result.txt -wait (monitor the tail)
答案 8 :(得分:5)
Get-content -Tail n file.txt
是唯一接近tail
的linux。
上面建议的Get-Content *filename* | Select-Object -last *n*
加载/解析整个事情。毋庸置疑,它对我的10GB日志文件不满意...... -Tail
选项确实从文件末尾开始。
答案 9 :(得分:5)
你也可以使用Git bash来模拟头部和尾部
答案 10 :(得分:2)
如果你想要head命令,一个简单的方法就是安装Cygwin。然后,您将拥有所有可用的UNIX工具。
如果这不是一个好的解决方案,那么你可以尝试使用findstr并搜索行尾指示符。
MSDN上的findstr:http://technet.microsoft.com/en-us/library/bb490907.aspx
答案 11 :(得分:2)
它包含一个tail.exe工具,但它只与某些Windows版本兼容
(从这篇文章复制:Tail command for windows)
答案 12 :(得分:1)
FWIW,对于那些只需要从文件头部剪掉不确定数量的记录的人, 更多> 效果很好。这对于在开发某些东西的早期阶段使用较小的文件非常有用。
答案 13 :(得分:1)
这是一个快速的本机头命令,它为您提供DOS中的前9行。
findstr /n "." myfile.txt | findstr "^.:"
每行的前2个字符将是行号。
答案 14 :(得分:1)
我没有尝试过提取范围,但我能够使用以下DOS命令获取一行:
find /N " " *.log|find "[6]"
由于大多数文件都包含空格,因此该命令从所有LOG文件中提取每一行,并且基本上从每个文件的1开始编号。然后将编号结果传送到第二个FIND
命令,该命令查找标记为数字6的行。
答案 15 :(得分:1)
您可以使用this page上的免费head
实用程序。我还没有尝试过。
答案 16 :(得分:0)
set /p line= < file.csv
echo %line%
它将在cmd Windows中以变量%line%。
返回文件的第一行答案 17 :(得分:0)
作为一个现代的答案,如果运行Windows 10,则可以使用“ Windows的Linux子系统”。
https://docs.microsoft.com/en-us/windows/wsl/install-win10
这将允许您从Windows内部运行本机linux命令,从而以与在linux中完全相同的方式运行tail。
答案 18 :(得分:0)
在PS中尝试使用命令:
Select -Last 1
此命令也可以通过管道传递。
获取第一行的示例:
type .\out.txt | Select -Last 1
或获取第一行:
type .\out.txt | Select -First 1
答案 19 :(得分:0)
保留第一行文本(头部):
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!)
)
注意:
head函数也可以通过fsutil
实现
尾部功能也可以通过fc
& comp
在 Win 10 cmd 上测试
答案 20 :(得分:-2)
警告,使用未知文本输入的批处理文件,令牌和delim功能可能会造成灾难,因为对&amp;,!,&lt;等字符进行了特殊解释。此类方法应保留为仅可预测文本。
答案 21 :(得分:-2)
我认为没有开箱即用的方法。在DOS中没有这样的命令,批处理文件远远限于模拟它(没有重大痛苦)。