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!
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.
Si vous êtes une personne de type Unix, l'installation de CygWin peut vous donner un environnement plus familier.
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:
findstr
fonctionne réellement correctement. Votre problème est avec échappement . (Voir référence de Rob pour plus de détails.)Tout d'abord, videz la sortie entière en utilisant dir/o-d
.
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`.
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
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.