Как отобразить первые 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
источник
.....................
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 даст вам более знакомую среду.

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

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

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

Например, если вы хотите вывести строки с 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.

Pacerier
источник
Это хорошее решение, но теперь у вас есть префикс номера, можно ли избавиться от них в последнем вызове 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.
hidde663
источник