Wie werden die ersten N Zeilen einer Befehlsausgabe in Windows angezeigt? (das Äquivalent zum Unix-Befehl "head")

17

Ich benötige ein Äquivalent zum Unix- headBefehl (zeige die ersten N Zeilen der Ausgabe an). Dies ist, was ich derzeit benutze:

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

Der obige Code zeigt die ersten 10 Zeilen der tasklistAusgabe an. find /N " "Stellt eine Zeilennummer vor den Anfang jeder Zeile, während findstr /r \[[0-9]\]die ersten 10 Zeilen mit Regex extrahiert werden.

Der obige Code funktioniert, aber ich muss einen beliebigen Bereich angeben . Aufgrund der Tatsache, dass reguläre Ausdrücke nicht gemäß den Standards in Windows implementiert sind, kann ich nichts anderes zum Laufen bringen.

Wie kann ich beliebige Zeilen aus einer Cmd-Ausgabe extrahieren? Es ist wichtig, dies mit einem Einzeiler zu tun. Keine Skripte!

giecsar
quelle
.....................
Giecsar

Antworten:

36

Power Shell.

PS C:\> netstat | Select -First 20

Bearbeiten: Ich habe das Gefühl, dass Sie darauf bestehen werden, dass Sie nur cmd.exe circa 1989 verwenden können, aber das ist nicht wahr. Powershell ist in jeder Betriebssystemversion Vista + integriert und kann unter XP / 2003 installiert werden. Es ist die Zukunft von Windows.

Bearbeiten: Okay, haben Sie es nach Ihren Wünschen.

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

Zeigt die ersten 10 Zeilen der Ausgabe von netstat an.

Ryan Ries
quelle
5
Ich habe keinen Zweifel, dass PowerShell die Zukunft ist, aber ich brauche etwas, das jetzt funktioniert. In der Realität eines Unternehmens haben die Kunden unserer Abteilung für technischen Support häufig Hunderte von Windows-Servern, von denen keiner Vista, 7 oder 8 hat. Ich kann unmöglich jedes Mal Zeit damit verschwenden, PowerShell zu installieren, wenn ich einen Befehl ausführen muss, und ich auch nicht sogar autorisiert zu.
Giecsar
Cmd.exe es ist ...
Ryan Ries
Alles, was sie brauchen würden, ist ein w2k8r2-Server, bei dem sie sich anmelden KÖNNEN, um einen Powershell-Befehl auszuführen. Ist das möglich?
Tony Roth
Ich weiß nicht, ob es 2K8-Server gibt, aber die Antwort von Ryan Ries ist genau das, was ich brauchte. Vielen Dank, Ryan!
Giecsar
1
Bitte vergiss nicht, ... die Antwort als ... akzeptiert zu markieren ...: `( rollt sich in der Ecke in einer fetalen Position zusammen und schluchzt zu sich selbst
Ryan Ries
8

Wenn Sie ein Unix-Typ sind, bietet Ihnen die Installation von CygWin möglicherweise eine vertrautere Umgebung.

vonbrand
quelle
2
Nein, ich dachte, ich hätte es klargestellt, aber ich kann nichts installieren. Es muss mit dem Windows-Befehlsprozessor (cmd.exe) ausgeführt werden. Keine PowerShell, kein CygWin, keine Skripte.
Giecsar
3

Es gibt eine einfache Lösung, die viel einfacher ist als die " for" Verwendung der Schleife.

Nehmen wir als Beispiel die Ausgabe von dir/o-d(in dirumgekehrter Reihenfolge nach Datum).

Wenn Sie beispielsweise die Zeilen 1 bis 16 ausgeben möchten, verwenden Sie:

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

Wenn Sie zB die Zeilen 16 bis 45 ausgeben möchten, verwenden Sie:

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

Beispielausgabe:

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

Nervenzusammenbruch:

  1. Sichern Sie zuerst die gesamte Ausgabe mit dir/o-d.

  2. Stellen Sie als nächstes jede Zeile mit " $Num:" voranfindstr/n ^^

    • ^bedeutet, dass der Zeilenanfang übereinstimmt, und ^^ist einfach eine Escape-Version erforderlich, da wir uns in cmd befinden.

    • Hinweis: Verwenden Sie findstrhierfür, da find/n" "Zeilen ohne Leerzeichen nicht übereinstimmen.

  3. Zuletzt beschneiden Sie die Ausgabe mit findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: ist Regex für 16 bis 19.

    • ^[2-3][0-9]: ist Regex für 20 - 39.

    • ^4[0-5]: ist Regex für 40 bis 45.

    • findstr "a b c"Mittel und Wege finden Strings , die entweder Ausdrücke übereinstimmen a, boder c.

Siehe auch /programming//q/8844868/632951

Pacerier
quelle
Das ist eine schöne Lösung, aber Sie haben jetzt die Nummer vorangestellt, kann man sie im letzten findstr-Aufruf loswerden?
fschmitt
@fschmitt, findstrkann nichts entfernen. Ich würde denken, Sie könnten in diesem Fall gezwungen sein, eine Schleife zu verwenden.
Pacerier
0

Dies ist ein einzeiliger Befehl, ich hoffe, dass er auch für Sie funktioniert.

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