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

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.


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.


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


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.