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

17

J'ai besoin d'un équivalent de la headcommande Unix (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 tasklistla sortie de. find /N " "ajoute un numéro de ligne au début de chaque ligne tout en findstr /r \[[0-9]\]extrayant les 10 premières lignes à l'aide de 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!

giecsar
la source
.....................
giecsar

Réponses:

36

Powershell.

PS C:\> netstat | Select -First 20

Edit: J'ai l'impression 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é à chaque version de système d'exploitation Vista + et peut être installé sur XP / 2003. Il est l'avenir de Windows.

Edit: Très bien, 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.

Ryan Ries
la source
5
Je n'ai aucun doute que PowerShell est l'avenir, mais j'ai besoin de quelque chose qui fonctionne, maintenant. Dans une réalité d'entreprise, les clients de notre service d'assistance technique ont souvent des centaines de serveurs Windows, dont aucun n'a Vista, 7 ou 8. Je ne peux pas perdre de temps à installer PowerShell à chaque fois que je dois exécuter une commande, ni même autorisé à.
giecsar
Cmd.exe c'est ...
Ryan Ries
tout ce dont ils auraient besoin, c'est d'un serveur w2k8r2 auquel ils peuvent se connecter pour exécuter une commande powershell, est-ce possible?
tony roth
Je ne sais pas s'il y a des serveurs 2K8, mais la réponse de Ryan Ries est exactement ce dont j'avais besoin. Merci beaucoup Ryan!
giecsar
1
N'oubliez pas de ... marquer la réponse comme ... acceptée ...: `(se recroqueville en position fœtale dans le coin et sanglote)
Ryan Ries
8

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

vonbrand
la source
2
Non, je pensais l'avoir précisé, mais je ne peux rien installer. Il doit s'exécuter avec le processeur de commandes Windows (cmd.exe). Pas de PowerShell, pas de CygWin, pas de scripts.
giecsar
3

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

Prenons la sortie de dir/o-d(ordre dirinverse par date) 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 " $Num:" en utilisantfindstr/n ^^

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

    • Remarque: vous devez utiliser findstrpour 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"des moyens à trouver des chaînes qui correspondent soit des expressions a, bou c.

Voir également /programming//q/8844868/632951

Pacerier
la source
C'est une bonne solution, mais vous avez maintenant le numéro préfixé, peut-on s'en débarrasser lors du dernier appel findstr?
fschmitt
@fschmitt, findstrne peut pas supprimer des éléments. Je pense que vous pourriez être obligé d'utiliser une boucle dans ce cas.
Pacerier
0

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.
hidde663
la source