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


17

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

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

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

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

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


.....................
— giecsar

Ответы:


36

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.


5
Я не сомневаюсь, что PowerShell - это будущее, но мне нужно то, что работает сейчас. В корпоративной реальности часто клиенты нашего отдела технической поддержки имеют сотни серверов Windows, ни на одном из которых нет Vista, 7 или 8. Я не могу тратить время на установку PowerShell каждый раз, когда мне нужно запустить команду, и я тоже не могу даже уполномочен.
— giecsar

Cmd.exe это ...
— Райан Райс

все, что им нужно, это один сервер w2k8r2, на который они МОГУТ войти, чтобы запустить команду powershell, это возможно?
— Тони Рот

Я не знаю, есть ли серверы 2K8, но ответ Райана Райса именно то, что мне нужно. Большое спасибо Райан!
— giecsar

1
Пожалуйста, не забудьте ... пометить ответ как ... принятый ...: `( свернувшись калачиком в положении плода в углу и рыдая в себя
— Райан Райс

8

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


2
Нет, я думал, что ясно дал понять, но я не могу ничего установить. Он должен работать с командным процессором Windows (cmd.exe). Нет PowerShell, нет CygWin, нет скриптов.
— giecsar

3

Есть простое решение, которое намного проще, чем использование цикла " 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.


Это хорошее решение, но теперь у вас есть префикс номера, можно ли избавиться от них в последнем вызове findstr?
— fschmitt

@fschmitt, findstrне могу удалить вещи. Я думаю, что в таком случае вы можете быть вынуждены использовать цикл.
— Pacerier

0

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

@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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.