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

13

Eu preciso de um equivalente do comando Unix head (exiba as primeiras N linhas da saída). Isso é o que estou usando atualmente:

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

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

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

Como posso extrair linhas arbitrárias de uma saída cmd? É importante fazer isso com um one-liner. Não há scripts!

    
por giecsar 24.03.2013 / 02:32

4 respostas

32

Powershell.

PS C:\> netstat | Select -First 20

Edit: Eu tenho a sensação de que você vai insistir que você só é capaz de usar cmd.exe por volta de 1989, mas isso não é verdade. O Powershell é usado em todas as versões do sistema operacional Vista + e pode ser instalado no XP / 2003. é 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

Exibirá as 10 primeiras linhas da saída do netstat.

    
por 24.03.2013 / 02:35
8

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

    
por 24.03.2013 / 03:08
3

Há uma solução fácil que é muito mais fácil do que usar o loop " for ".

Vamos usar como saída a saída de dir/o-d ( dir inverse-ordered by date).

Por exemplo se você quiser enviar as linhas de 1 a 16, use:

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

Por exemplo Se você quiser enviar linhas de 16 a 45, use:

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

Exemplo de saída:

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
...

Divisão:

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

  2. Em seguida, prefixar cada linha com " $Num: " usando findstr/n ^^

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

    • Observação: você precisa usar findstr para isso porque find/n" " não corresponderá a linhas sem espaços '.

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

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

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

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

    • findstr "a b c" significa encontrar strings que correspondam às expressões a , b ou c .

Veja também o link

    
por 25.08.2015 / 14:59
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.
    
por 03.11.2016 / 16:12