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

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

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

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

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

Как извлечь произвольные строки из вывода cmd? Важно сделать это с помощью одной строки. Нет сценариев!

4 ответа

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.
Другие вопросы по тегам