【问题标题】:Windows equivalent of the 'tail' command [duplicate]Windows相当于“tail”命令[重复]
【发布时间】:2009-08-18 16:38:08
【问题描述】:

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

【问题讨论】:

  • head 不只显示前 n 行而不是将它们排除在外吗?
  • 请 Chris 考虑自 2009 年以来的新答案,更具体地说是 Amit Portnoy's answer。由于您的问题很笼统,许多用户可能会找到此网页。他们可能会在第一个答案之后停止阅读:您已接受的答案。您可以将您已接受的答案更改为另一个更符合当今可能性的答案。干杯;)
  • 我有点困惑。最初的问题是关于 Unix 风格的 head 命令,但所需的输出看起来像是需要 tail。看起来答案是关于head 而不是tail
  • @blakeoft 最初的问题是询问tail 的行为,但标题却是head
  • 示例中并不清楚预期的命令是*[call to tail]* 2 > result.txt,在这种情况下它等价于tail,或*[call to tail]* 1 > result.txt,在这种情况下不是。

标签: windows command-line


【解决方案1】:

如果你已经安装了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。 还添加了 HeadFirst 别名到 TotalCount

所以,命令可以重写为

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

【讨论】:

  • 这不是像head 而不是tail吗?
  • @blakeoft 是的……我已经更新了我的答案。令人惊讶的是,在有人对此发表评论之前花了 2 年 17 票。
  • @blakeoft 刚刚意识到问题已被编辑! (请参阅 stackoverflow.com/posts/1295068/revisions)。它最初要求 head 命令...更新以包含两个答案...
  • @AmitPortnoy 我在这个堆栈交换的某个地方找到了另一个答案,说Get-Content 现在有一个tail 命令。例如,Get-content -Tail 5 file.txt 将打印 file.txt 的最后五行。感谢您更新您的答案。
  • 有什么方法可以将它用作过滤器? (例如,读取标准输入而不是文件)
【解决方案2】:

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

DOS 提示:

C:\>more +2 myfile.txt

上述命令将输出前 2 行之后的所有内容。
这实际上是 Unix head 的逆:

Unix 控制台:

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

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

【讨论】:

  • 不,不一样。 tail 从文件末尾开始计数。所以,tail -2 将打印最后两行。
  • 我也可以打印前 n 个字符吗?
  • @ADTC(我的版本)tail 不支持底片。只有头部(gnuwin32)
  • @nl-x -2 不是否定的。它只是-n 2(行数)的简写版本。不幸的是,太多的tail 实现不支持-2,这使得它与支持的head 实现非常不一致。这让我恼火太多次了。
  • @ADTC 对不起。我对head -n -2 感到困惑,这与head -n 2 不同。但是有了tail,后者就不存在了。
【解决方案3】:
more /e filename.txt P n

其中 n = 要显示的行数。运行速度快,与head 命令完全一样。

【讨论】:

  • P、S等命令只能由用户在提示符下输入。它们不能传递给更多命令。因此,上面的示例不起作用
【解决方案4】:

您可以从GnuWin32 获得CoreUtils,这是一个标准unix 工具的集合,已移植到Windows。

除其他外,它还包含头部。

【讨论】:

    【解决方案5】:

    Powershell:

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

    【讨论】:

    • 这是正确答案,最新且相关(与 cmd 不同)。谢谢。
    【解决方案6】:

    这完全是一个技巧,但如果它是一个巨大的文件,您只想检查格式、标题等,并且您正在寻找解决方案,您总是可以将“更多”输出重定向到一个新文件,然后CTRL-C 快速。输出行无法精确控制,您很可能会在输出行的中间杀死它,但这是获取一小部分原本无法使用的文件的廉价方法。

    例如

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

    【讨论】:

      【解决方案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”是文件名。

      【讨论】:

      • +1 表示比下载head 端口花费的时间更长的解决方案。
      • 注意:将此表达式放在括号中 - (expr) > out.txt - 将结果发送到文件时,否则您只会得到最后一行。或附加 - expr >> out.txt.
      【解决方案8】:

      当使用 Matt 已经提到的更多 +n 时,为了避免在长文件中暂停,试试这个:

      更多 +1 myfile.txt > 骗局

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        【解决方案10】:

        Get-content -Tail n file.txt with powershell 是 linux 中唯一接近 tail 的东西。

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

        【讨论】:

          【解决方案11】:

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

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

          (复制自本帖:Tail command for windows

          【讨论】:

            【解决方案12】:

            如果你想要 head 命令,一个简单的方法是安装 Cygwin。然后您就可以使用所有的 UNIX 工具了。

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

            在 MSDN 上查找:http://technet.microsoft.com/en-us/library/bb490907.aspx

            【讨论】:

              【解决方案13】:

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

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

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

              【讨论】:

                【解决方案14】:

                在 PS 中尝试使用命令:

                Select -Last 1
                

                这个命令也可以流水线化。

                获取第一行的示例:

                type .\out.txt | Select -Last 1
                

                或获取第一行:

                 type .\out.txt | Select -First 1
                

                【讨论】:

                  【解决方案15】:

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

                  【讨论】:

                    【解决方案16】:

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

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

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

                    【讨论】:

                      【解决方案17】:
                      set /p line= < file.csv 
                      echo %line%
                      

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

                      【讨论】:

                        【解决方案18】:

                        this page 上有一个免费的 head 实用程序供您使用。我还没试过。

                        【讨论】:

                        • 完全像 UNIX head 实用程序一样执行。
                        【解决方案19】:

                        作为现代答案,如果运行 Windows 10,您可以使用“Linux Subsystem for Windows”。

                        https://docs.microsoft.com/en-us/windows/wsl/install-win10

                        这将允许您在 Windows 中运行本机 linux 命令,从而完全按照您在 linux 中的方式运行。

                        【讨论】:

                          【解决方案20】:

                          保留第一几行文字(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!)
                          )
                          

                          注意:
                          头部功能也可以通过fsutil实现
                          尾部功能也可以通过fc&comp实现

                          在 Win 10 cmd 上测试

                          【讨论】:

                            【解决方案21】:

                            我认为没有办法开箱即用。 DOS 中没有这样的命令,批处理文件也远远受限于模拟它(没有大的痛苦)。

                            【讨论】:

                              【解决方案22】:

                              警告,由于对 &、!、

                              【讨论】:

                                猜你喜欢
                                • 2012-02-24
                                • 1970-01-01
                                • 2015-01-31
                                • 2012-03-27
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2014-09-23
                                • 2010-09-16
                                相关资源
                                最近更新 更多