¿Cómo mostrar las primeras N líneas de una salida de comando en Windows? (el equivalente del comando Unix "cabeza")

17

Necesito un equivalente del headcomando Unix (mostrar las primeras N líneas de la salida). Esto es lo que estoy usando actualmente:

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

El código anterior muestra las primeras 10 líneas de tasklistsalida. find /N " "antepone un número de línea al comienzo de cada línea mientras findstr /r \[[0-9]\]extrae las primeras 10 líneas usando expresiones regulares.

El código anterior funciona, pero necesito especificar cualquier rango . Debido al hecho de que las expresiones regulares no se implementan de acuerdo con los estándares de Windows, no puedo hacer que nada más funcione.

¿Cómo puedo extraer líneas arbitrarias de una salida de cmd? Es importante hacer esto con una sola línea. No hay guiones!

giecsar
fuente
.....................
giecsar

Respuestas:

36

Potencia Shell.

PS C:\> netstat | Select -First 20

Editar: Tengo la sensación de que insistirá en que solo puede usar cmd.exe alrededor de 1989, pero eso no es cierto. Powershell está integrado en cada versión del sistema operativo Vista +, y es instalable en XP / 2003. Que es el futuro de Ventanas.

Editar: Muy bien, hazlo a tu manera.

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

Mostrará las primeras 10 líneas de la salida de netstat.

Ryan Ries
fuente
55
No tengo dudas de que PowerShell es el futuro, pero necesito algo que funcione ahora. En una realidad empresarial, a menudo los clientes de nuestro departamento de soporte técnico tienen cientos de servidores Windows, ninguno de los cuales tiene Vista, 7 u 8. No puedo perder el tiempo instalando PowerShell cada vez que necesito ejecutar un comando, ni tampoco incluso autorizado para.
giecsar
Cmd.exe es ...
Ryan Ries
todo lo que necesitarían es un servidor w2k8r2 en el que PUEDAN iniciar sesión para ejecutar un comando de PowerShell, ¿es eso posible?
Tony Roth
No sé si hay servidores 2K8, pero la respuesta de Ryan Ries es exactamente lo que necesitaba. Muchas gracias Ryan!
giecsar
1
Por favor, no olvide ... marcar la respuesta como ... aceptada ...: `(se acurruca en posición fetal en la esquina y solloza a sí mismo
Ryan Ries
8

Si usted es una persona de tipo Unix, quizás instalar CygWin le brinde un entorno más familiar.

vonbrand
fuente
2
No, pensé que lo había dejado claro, pero no puedo instalar nada. Debe ejecutarse con el procesador de comandos de Windows (cmd.exe). Sin PowerShell, sin CygWin, sin scripts.
giecsar
3

Hay una solución fácil que es mucho más fácil que usar el forbucle " ".

Tomemos la salida de dir/o-d(orden dirinverso por fecha) como ejemplo.

Por ejemplo, si desea generar líneas 1 a 16, use:

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

Por ejemplo, si desea generar líneas 16 a 45, use:

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

Salida de muestra:

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

Descompostura:

  1. Primero, volcar toda la salida usando dir/o-d.

  2. Luego, anteponga cada línea con " $Num:" usandofindstr/n ^^

    • ^significa inicio de línea de coincidencia, y ^^es simplemente que se requiere una versión con escape porque estamos en cmd.

    • Nota: debe usar findstresto porque find/n" "no coincidirá con líneas sin espacios '.

  3. Por último, recorte la salida usando findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

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

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

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

    • findstr "a b c"medios encontrar cadenas que concuerden con cualquiera de las expresiones a, b, o c.

Consulte también /programming//q/8844868/632951

Pacerier
fuente
Esa es una buena solución, pero ahora tienes el número prefijado allí, ¿puedes deshacerte de ellos en la última llamada de FindStr?
fschmitt
@fschmitt, findstrno puede eliminar cosas. Creo que podría verse obligado a usar un bucle en ese caso.
Pacerier
0

Este es un comando de una línea, espero que funcione para usted también.

@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
fuente