web-dev-qa-db-fra.com

Comment afficher les N premières lignes d'une sortie de commande sous Windows? (l'équivalent de la commande Unix "head")

J'ai besoin d'un équivalent de la commande Unix head (afficher les N premières lignes de la sortie). Voici ce que j'utilise actuellement:

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

Le code ci-dessus affiche les 10 premières lignes de la sortie de tasklist. find /N " " ajoute un numéro de ligne au début de chaque ligne tandis que findstr /r \[[0-9]\] extrait les 10 premières lignes en utilisant l'expression régulière.

Le code ci-dessus fonctionne, mais je dois spécifier n'importe quelle plage. Étant donné que les expressions régulières ne sont pas implémentées conformément aux normes de Windows, je ne peux rien faire d'autre.

Comment puis-je extraire des lignes arbitraires d'une sortie cmd? Il est important de le faire avec une doublure. Pas de scripts!

18
giecsar

Powershell.

PS C:\> netstat | Select -First 20

Edit: J'ai le sentiment que vous allez insister sur le fait que vous ne pouvez utiliser cmd.exe que vers 1989, mais ce n'est pas vrai. Powershell est intégré à toutes les versions de système d'exploitation Vista + et peut être installé sur XP/2003. Il est l'avenir de Windows.

Edit: Bon, faites-le à votre façon.

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

Affiche les 10 premières lignes de la sortie de netstat.

37
Ryan Ries

Si vous êtes une personne de type Unix, l'installation de CygWin peut vous donner un environnement plus familier.

8
vonbrand

Il existe une solution simple qui est beaucoup plus simple que d'utiliser la boucle "for".

Prenons la sortie de dir/o-d (dir dans l'ordre inverse des dates) comme exemple.

Par exemple. si vous voulez sortir les lignes 1 à 16, utilisez:

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

Par exemple. si vous voulez sortir les lignes 16 à 45, utilisez:

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

Exemple de sortie:

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

Panne:

  1. Tout d'abord, videz la sortie entière en utilisant dir/o-d.

  2. Ensuite, ajoutez chaque ligne avec "$Num:" en utilisant findstr/n ^^

    • ^ signifie correspondre au début de la ligne et ^^ est simplement sa version d'échappement requise car nous sommes en cmd.

    • Remarque: vous devez utiliser findstr pour cela car find/n" " ne correspondra pas aux lignes sans espaces`.

  3. Enfin, recadrez la sortie à l'aide de findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: est regex pour 16 à 19.

    • ^[2-3][0-9]: est regex pour 20 - 39.

    • ^4[0-5]: est regex pour 40 à 45.

    • findstr "a b c" signifie rechercher des chaînes qui correspondent aux expressions a, b ou c.

Voir également https://stackoverflow.com/q/8844868/632951

3
Pacerier

Ceci est une commande en ligne, j'espère que cela fonctionne aussi pour vous.

@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.
0
hidde663