Як відобразити перші N рядків командного виводу в Windows? (еквівалент команди Unix “head”)


17

Мені потрібен еквівалент команди Unix head(відобразити перші N рядків виводу). Це те, що я зараз використовую:

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

Вищевказаний код відображає перші 10 рядків tasklistвиводу 's. 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 це ...
Ryan Ries

все, що їм знадобиться, - це один сервер w2k8r2, на якому вони МОГУТЬ увійти, щоб виконати команду powerhell, чи це можливо?
тоні рот

Я не знаю, чи є 2K8 сервери, але відповідь Райана Різа - саме те, що мені було потрібно. Дуже дякую, Райан!
giecsar

1
Будь ласка, не забудьте ... позначте відповідь як ... прийнято ...: `( згортається в положенні плода в кутку і ридає самому
Ryan Ries

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.

Також дивіться /programming//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.