Мне нужен эквивалент 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
...
Сломать:
findstr
регулярное выражение действительно работает правильно. Ваша проблема связана с побег. (Видеть Ссылка Роба для подробностей.)Сначала выгрузите весь вывод, используя dir/o-d
.
Затем добавьте к каждой строке "$Num:
" с помощью findstr/n ^^
^
означает совпадение начала строки, и ^^
просто требуется экранированная версия, потому что мы находимся в cmd.
Примечание: вам нужно использовать findstr
для этого, потому что find/n" "
не будет соответствовать строкам без пробелов.
Наконец, обрежьте результат, используя 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
.
Это однострочная команда, надеюсь, она сработает и для вас.
@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.