Jak wyświetlić pierwsze N ​​wierszy polecenia wyjściowego w systemie Windows? (odpowiednik uniksowego polecenia „head”)

17

Potrzebuję odpowiednika headpolecenia Unix (wyświetl pierwsze N ​​wierszy wyniku). Z tego obecnie korzystam:

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

Powyższy kod wyświetla pierwsze 10 wierszy tasklistwyniku. find /N " "wstawia numer linii na początek każdej linii, a findstr /r \[[0-9]\]wypakowuje pierwsze 10 linii za pomocą wyrażenia regularnego.

Powyższy kod działa, ale muszę podać dowolny zakres . Z uwagi na fakt, że wyrażenia regularne nie są implementowane zgodnie ze standardami w systemie Windows, nic innego nie działa.

Jak mogę wyodrębnić dowolne linie z wyjścia cmd? Ważne jest, aby to zrobić za pomocą jednej wkładki. Bez skryptów!

giecsar
źródło
.....................
giecsar

Odpowiedzi:

36

PowerShell.

PS C:\> netstat | Select -First 20

Edycja: Mam wrażenie, że nalegasz, abyś mógł używać tylko cmd.exe około 1989 roku, ale to nieprawda. Powershell jest wypiekany do każdej wersji systemu operacyjnego Vista + i można go zainstalować na XP / 2003. To jest przyszłość Windows.

Edycja: Dobra, miej to na swój sposób.

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

Wyświetli pierwsze 10 wierszy wyniku polecenia netstat.

Ryan Ries
źródło
5
Nie mam wątpliwości, że PowerShell to przyszłość, ale potrzebuję teraz czegoś, co działa. W rzeczywistości korporacyjnej często klienci naszego działu pomocy technicznej mają setki serwerów Windows, z których żaden nie ma Vista, 7 lub 8. Nie mogę marnować czasu na instalowanie PowerShell za każdym razem, gdy muszę uruchomić polecenie, ani nie jestem nawet upoważniony do.
giecsar
Cmd.exe to ...
Ryan Ries
wystarczyłby tylko jeden serwer w2k8r2, do którego MOGĄ zalogować się, aby uruchomić polecenie PowerShell, czy to możliwe?
Tony Roth
Nie wiem, czy istnieją serwery 2K8, ale odpowiedź Ryana Riesa była dokładnie tym, czego potrzebowałem. Dziękuję bardzo Ryan!
giecsar
1
Proszę nie zapomnieć o ... oznaczeniu odpowiedzi jako ... zaakceptowanej ...: `( zwija się w pozycji embrionalnej w kącie i szlocha do siebie
Ryan Ries
8

Jeśli jesteś osobą typu Unix, być może instalacja CygWin zapewni ci bardziej znane środowisko.

vonbrand
źródło
2
Nie, myślałem, że to wyjaśniłem, ale nie mogę niczego zainstalować. Musi działać z procesorem poleceń systemu Windows (cmd.exe). Bez programu PowerShell, bez CygWin, bez skryptów.
giecsar
3

Istnieje proste rozwiązanie, które jest znacznie łatwiejsze niż użycie forpętli „ ”.

Weźmy jako przykład dane wyjściowe z dir/o-d( dirodwrotnie uporządkowane według daty).

Np. Jeśli chcesz wypisać linie od 1 do 16, użyj:

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

Np. Jeśli chcesz wypisać linie od 16 do 45, użyj:

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

Przykładowe dane wyjściowe:

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

Awaria:

  • Oprócz nieobsługiwanych funkcji , findstrwyrażenie regularne faktycznie działa poprawnie. Twój problem polega na ucieczce . (Szczegółowe informacje znajdują się w dokumentacji Roba ).

  1. Najpierw zrzuć cały wynik za pomocą dir/o-d.

  2. Następnie wstaw każdą linię za pomocą „ $Num:findstr/n ^^

    • ^oznacza dopasowanie początku linii i ^^jest po prostu jego wymaganą wersją, ponieważ jesteśmy w cmd.

    • Uwaga: musisz użyć findstrdo tego, ponieważ find/n" "nie będzie pasować linii bez spacji`.

  3. Na koniec przytnij dane wyjściowe za pomocą findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: jest wyrażeniem regularnym dla 16 do 19.

    • ^[2-3][0-9]: jest wyrażeniem regularnym dla 20 - 39.

    • ^4[0-5]: jest wyrażeniem regularnym dla 40 do 45.

    • findstr "a b c"środki znaleźć ciągi, które pasują zarówno wyrażenia a, blub c.

Zobacz także /programming//q/8844868/632951

Pacerier
źródło
To miłe rozwiązanie, ale teraz masz tam prefiks, czy można się go pozbyć w ostatnim wywołaniu findstr?
fschmitt
@fschmitt, findstrnie można usunąć rzeczy. Myślę, że w takim przypadku możesz być zmuszony do użycia pętli.
Pacerier
0

To jedno-wierszowe polecenie, mam nadzieję, że zadziała również dla ciebie.

@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
źródło