首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一种方法来模拟Windows cmd中的head命令?

是否有一种方法来模拟Windows cmd中的head命令?
EN

Stack Overflow用户
提问于 2015-06-11 16:58:00
回答 2查看 1.6K关注 0票数 0

我正在尝试获取大型文本文件( DB表的100 K记录)的前几行,它太大了,无法在文本编辑器中进行真正的操作。

如果我在linux,我会使用head。我知道我可以用

更多+99995 dbfile.txt

以获取文件中的最后5行。是否有一种类似的(简单的)方法来获得第一行和这样的日志记录?

谢谢。

(请注意,能够记录这是必须的)。

EN

回答 2

Stack Overflow用户

发布于 2017-05-07 20:40:29

head.bat

代码语言:javascript
运行
复制
@echo off

setlocal DISABLEDELAYEDEXPANSION

set "NUM=%~1"
if "%NUM%" == "" set NUM=0

set LINE_INDEX=0

for /F "usebackq delims=" %%i in (`findstr /B /N /R /C:".*"`) do (
  set LINE_STR=%%i
  call :IF_OR_PRINT %%NUM%% NEQ 0 if %%LINE_INDEX%% GEQ %%NUM%% && exit /b 0
  set /A LINE_INDEX+=1
)

exit /b 0

:IF_OR_PRINT
if %* exit /b 0
setlocal ENABLEDELAYEDEXPANSION
set OFFSET=0
:OFFSET_LOOP
set CHAR=!LINE_STR:~%OFFSET%,1!
if not "!CHAR!" == ":" ( set /A OFFSET+=1 && goto OFFSET_LOOP )
set /A OFFSET+=1
echo.!LINE_STR:~%OFFSET%!
exit /b 1

使用

类型文件\ head.bat 1000

特性

  • 打印所有字符,包括控制字符,如!%^&|>等。
  • 不会消耗空行。

发行

  • findstr截断超过8180个字符的行("FINDSTR:行NNN太长“消息)
  • 不要太快,在3.2GHzAMD处理器上打印大约8秒的2000行
票数 0
EN

Stack Overflow用户

发布于 2015-06-11 19:08:31

为什么要在Windows组中提到像Unix这样的玩具呢?你不是很聪明吧。

切割

代码语言:javascript
运行
复制
filter cut {t|b} {i|x} NumOfLines

从文件的顶部或底部减少行数。

代码语言:javascript
运行
复制
t - top of the file
b - bottom of the file
i - include n lines
x - exclude n lines

示例

代码语言:javascript
运行
复制
cscript //nologo filter cut t i 5 < "%systemroot%\win.ini"

脚本

代码语言:javascript
运行
复制
Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Set rs = CreateObject("ADODB.Recordset")
With rs
    .Fields.Append "LineNumber", 4 

    .Fields.Append "Txt", 201, 5000 
    .Open
    LineCount = 0
    Do Until Inp.AtEndOfStream
        LineCount = LineCount + 1
        .AddNew
        .Fields("LineNumber").value = LineCount
        .Fields("Txt").value = Inp.readline
        .UpDate
    Loop

    .Sort = "LineNumber ASC"

    If LCase(Arg(1)) = "t" then
        If LCase(Arg(2)) = "i" then
            .filter = "LineNumber < " & LCase(Arg(3)) + 1
        ElseIf LCase(Arg(2)) = "x" then
            .filter = "LineNumber > " & LCase(Arg(3))
        End If
    ElseIf LCase(Arg(1)) = "b" then
        If LCase(Arg(2)) = "i" then
            .filter = "LineNumber > " & LineCount - LCase(Arg(3))
        ElseIf LCase(Arg(2)) = "x" then
            .filter = "LineNumber < " & LineCount - LCase(Arg(3)) + 1
        End If
    End If

    Do While not .EOF
        Outp.writeline .Fields("Txt").Value

        .MoveNext
    Loop
End With
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30786965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档