Назад | Перейти на главную страницу

Как отобразить первые N строк вывода команды в Windows? (эквивалент Unix-команды «head»)

Мне нужен эквивалент Unix head команда (отобразить первые N строк вывода). Вот что я использую сейчас:

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

Приведенный выше код отображает первые 10 строк tasklistвывод. find /N " " добавляет номер строки к началу каждой строки, а findstr /r \[[0-9]\] извлекает первые 10 строк с помощью регулярного выражения.

Код выше работает, но мне нужно указать любой диапазон. Из-за того, что регулярные выражения не реализованы в соответствии со стандартами в Windows, я не могу заставить работать больше ничего.

Как я могу извлечь произвольные строки из вывода cmd? Важно сделать это однострочным. Никаких скриптов!

Powershell.

PS C:\> netstat | Select -First 20

Изменить: у меня такое чувство, что вы будете настаивать на том, что вы можете использовать cmd.exe только около 1989 года, но это неправда. Powershell встроен в каждую версию ОС Vista + и может быть установлен на XP / 2003. Это является будущее Windows.

Изменить: Хорошо, пусть будет по-своему.

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

Отображает первые 10 строк вывода netstat.

Если вы человек типа Unix, возможно, установите CygWin дает вам более знакомую среду.

Есть простое решение, которое намного проще, чем использование "for"петля.

Возьмем вывод из dir/o-d (dir в обратном порядке по дате) в качестве примера.

Например. если вы хотите вывести строки с 1 по 16, используйте:

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

Например. если вы хотите вывести строки с 16 по 45, используйте:

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

Пример вывода:

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

Сломать:

  1. Сначала выгрузите весь вывод, используя dir/o-d.

  2. Затем добавьте к каждой строке "$Num:" с помощью findstr/n ^^

    • ^ означает совпадение начала строки, и ^^ просто требуется экранированная версия, потому что мы находимся в cmd.

    • Примечание: вам нужно использовать findstr для этого, потому что find/n" " не будет соответствовать строкам без пробелов.

  3. Наконец, обрежьте результат, используя findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: является регулярным выражением от 16 до 19.

    • ^[2-3][0-9]: является регулярным выражением от 20 до 39.

    • ^4[0-5]: является регулярным выражением от 40 до 45.

    • findstr "a b c" означает найти строки, которые соответствуют любому выражению a, b, или c.

Также см https://stackoverflow.com/q/8844868/632951

Это однострочная команда, надеюсь, она сработает и для вас.

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