Как отобразить первые 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
...
Сломать:
- Помимо неподдерживаемых функций,
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.