Come visualizzare le prime N righe di un output di comando in Windows? (l'equivalente del comando Unix "head")


17

Ho bisogno di un equivalente del headcomando Unix (visualizza le prime N righe dell'output). Questo è quello che sto usando attualmente:

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

Il codice sopra mostra le prime 10 righe tasklistdell'output. find /N " "antepone un numero di riga all'inizio di ogni riga mentre findstr /r \[[0-9]\]estrae le prime 10 righe usando regex.

Il codice sopra funziona, ma devo specificare qualsiasi intervallo . A causa del fatto che le espressioni regolari non sono implementate secondo gli standard di Windows, non riesco a far funzionare nient'altro.

Come posso estrarre linee arbitrarie da un output cmd? È importante farlo con una fodera. Nessuno script!


.....................
giecsar,

Risposte:


36

PowerShell.

PS C:\> netstat | Select -First 20

Modifica: ho la sensazione che insisterete sul fatto di poter usare solo cmd.exe intorno al 1989, ma non è vero. Powershell è integrato in ogni versione del sistema operativo Vista + ed è installabile su XP / 2003. Si è il futuro di Windows.

Modifica: Va bene, fai a modo tuo.

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

Visualizzerà le prime 10 righe dell'output di netstat.


5
Non ho dubbi che PowerShell è il futuro, ma ho bisogno di qualcosa che funzioni, ora. In una realtà aziendale, spesso i clienti del nostro dipartimento di supporto tecnico dispongono di centinaia di server Windows, nessuno dei quali ha Vista, 7 o 8. Non posso assolutamente perdere tempo a installare PowerShell ogni volta che devo eseguire un comando, e nemmeno io anche autorizzato a.
giecsar,

Cmd.exe è ...
Ryan Ries il

tutto ciò di cui avrebbero bisogno è un server w2k8r2 a cui possono accedere per eseguire un comando powershell, è possibile?
tony roth,

Non so se ci sono server 2K8, ma la risposta di Ryan Ries è esattamente ciò di cui avevo bisogno. Grazie mille Ryan!
giecsar,

1
Per favore, non dimenticare di ... contrassegnare la risposta come ... accettata ...: `( rannicchiata in posizione fetale in un angolo e singhiozza da sola
Ryan Ries

8

Se sei una persona di tipo Unix, forse l'installazione di CygWin ti dà un ambiente più familiare.


2
No, pensavo di averlo chiarito, ma non riesco a installare nulla. Deve essere eseguito con il processore dei comandi di Windows (cmd.exe). Nessun PowerShell, nessun CygWin, nessun script.
martedì

3

C'è una soluzione semplice che è molto più semplice dell'uso del forciclo " ".

Prendiamo l'output di dir/o-d(ordine dirinverso per data) come esempio.

Ad esempio, se si desidera emettere le righe da 1 a 16, utilizzare:

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

Ad esempio, se si desidera emettere righe da 16 a 45, utilizzare:

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

Uscita campione:

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

Abbattersi:

  1. Per prima cosa, scarica l'intero output usando dir/o-d.

  2. Quindi, anteporre ogni riga con " $Num:" usandofindstr/n ^^

    • ^significa che corrisponde all'inizio della riga ed ^^è semplicemente necessaria la versione con escape perché siamo in cmd.

    • Nota: devi usarlo findstrper questo perché find/n" "non corrisponderà alle linee senza spazi ».

  3. Infine, ritaglia l'output usando findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: è regex per 16 a 19.

    • ^[2-3][0-9]: è regex per 20 - 39.

    • ^4[0-5]: è regex per 40 a 45.

    • findstr "a b c"mezzi trovare stringhe che corrispondono entrambi espressioni a, b, o c.

Vedi anche /programming//q/8844868/632951


Questa è una buona soluzione, ma ora hai il numero prefissato lì, si può liberarsene nell'ultima chiamata findstr?
fschmitt,

@fschmitt, findstrimpossibile rimuovere le cose. Penso che potresti essere costretto a usare un loop in quel caso.
Pacerier,

0

Questo è un comando a una riga, spero che funzioni anche per te.

@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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.