Como exibir as primeiras N linhas de uma saída de comando no Windows? (o equivalente ao comando Unix "head")

17

Eu preciso de um equivalente ao headcomando Unix (exibir as primeiras N linhas da saída). Isto é o que estou usando atualmente:

tasklist | find /N " " | findstr /r \[[0-9]\]

O código acima exibe as 10 primeiras linhas de tasklistsaída. find /N " "precede um número de linha no início de cada linha enquanto findstr /r \[[0-9]\]extrai as 10 primeiras linhas usando regex.

O código acima funciona, mas preciso especificar qualquer intervalo . Devido ao fato de que expressões regulares não são implementadas de acordo com os padrões do Windows, não consigo fazer com que mais nada funcione.

Como posso extrair linhas arbitrárias de uma saída cmd? É importante fazer isso com uma linha. Sem scripts!

giecsar
fonte
.....................
giecsar

Respostas:

36

Powershell.

PS C:\> netstat | Select -First 20

Edit: Tenho a sensação de que você insistirá em usar o cmd.exe por volta de 1989, mas isso não é verdade. O Powershell é instalado em todas as versões do sistema operacional Vista + e é instalável no XP / 2003. Ele é o futuro do Windows.

Edit: Tudo bem, faça do seu jeito.

C:\> netstat -an > temp.txt && for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" temp.txt ^| findstr /r "^%l:"') do @echo %b

Irá exibir as 10 primeiras linhas da saída do netstat.

Ryan Ries
fonte
5
Não tenho dúvidas de que o PowerShell é o futuro, mas preciso de algo que funcione agora. Em uma realidade corporativa, muitas vezes os clientes do nosso departamento de suporte técnico têm centenas de servidores Windows, nenhum deles com Vista, 7 ou 8. Não posso perder tempo instalando o PowerShell toda vez que preciso executar um comando, nem estou mesmo autorizado a.
giecsar
Cmd.exe é ...
Ryan Ries
tudo o que eles precisariam é de um servidor w2k8r2 no qual PODEM logar para executar um comando PowerShell, isso é possível?
tony roth
Não sei se existem servidores 2K8, mas a resposta de Ryan Ries é exatamente o que eu precisava. Muito obrigado Ryan!
giecsar
1
Por favor, não se esqueça de ... marcar a resposta como ... aceito ...: '( ondula acima na posição fetal no canto e soluços a auto
Ryan Ries
8

Se você é do tipo Unix, talvez a instalação do CygWin ofereça um ambiente mais familiar.

vonbrand
fonte
2
Não, pensei ter deixado claro, mas não consigo instalar nada. Ele deve ser executado com o processador de comandos do Windows (cmd.exe). Sem PowerShell, sem CygWin, sem scripts.
giecsar
3

Existe uma solução fácil que é muito mais fácil do que usar o forloop " ".

Vamos pegar a saída de dir/o-d(ordem dirinversa por data) como exemplo.

Por exemplo, se você deseja gerar as linhas 1 a 16, use:

dir/o-d|findstr/n ^^|findstr "^[1-9]: ^1[0-6]:"

Por exemplo, se você deseja gerar as linhas 16 a 45, use:

dir/o-d|findstr/n ^^|findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:"

Saída de amostra:

16:08/08/2016  08:43 AM    <DIR>          nacl_sdk
17:11/05/2016  10:48 PM    <DIR>          3b 2
18:28/04/2016  02:47 PM    <DIR>          sample
19:22/04/2016  10:07 PM    <DIR>          mysql test
20:16/04/2016  01:22 AM    <DIR>          3b
21:16/04/2016  01:10 AM             2,706 errorlog
22:16/04/2016  12:53 AM                 0 accesslog
...

Demolir:

  1. Primeiro, despeje toda a saída usando dir/o-d.

  2. Em seguida, anteceda cada linha com " $Num:" usandofindstr/n ^^

    • ^significa coincidir com o início da linha e ^^é simplesmente a versão escapada necessária porque estamos no cmd.

    • Nota: você precisa usar findstrpara isso, porque find/n" "não corresponderá a linhas sem espaços`.

  3. Por fim, corte a saída usando findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: é regex para 16 a 19.

    • ^[2-3][0-9]: é regex para 20 - 39.

    • ^4[0-5]: é regex para 40 a 45.

    • findstr "a b c"meios encontrar cordas que correspondem tanto expressões a, b, ou c.

Consulte também /programming//q/8844868/632951

Pacerier
fonte
Essa é uma boa solução, mas agora você tem o número prefixado lá, alguém pode se livrar deles na última chamada findstr?
Fschmitt #
@fschmitt, findstrnão pode remover coisas. Eu acho que você pode ser forçado a usar um loop nesse caso.
Pacerier 26/11/15
0

Este é um comando de uma linha, espero que funcione para você também.

@echo off&cls&for /f "tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=1 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=2 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=3 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=4 tokens=*" %a in (Graph.bat) do echo %a&pause>nul

:: Run this from CMD.exe and make sure that your file is in your current working directory.

::Replace Graph.bat with your file.
hidde663
fonte