Bagaimana cara menampilkan baris N pertama dari output perintah di Windows? (setara dengan perintah "head" Unix)

17

Saya perlu setara dengan headperintah Unix (menampilkan garis N pertama dari output). Inilah yang saya gunakan saat ini:

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

Kode di atas menampilkan 10 baris pertama dari tasklistoutput. find /N " "menambahkan nomor baris ke awal setiap baris sementara findstr /r \[[0-9]\]mengekstrak 10 baris pertama menggunakan regex.

Kode di atas berfungsi, tetapi saya harus menentukan rentang apa pun . Karena kenyataan bahwa ekspresi reguler tidak diterapkan sesuai dengan standar di Windows, saya tidak bisa membuat yang lain berfungsi.

Bagaimana saya bisa mengekstrak garis arbitrer dari output cmd? Penting untuk melakukan ini dengan satu garis. Tanpa skrip!

giecsar
sumber
.....................
giecsar

Jawaban:

36

Powershell.

PS C:\> netstat | Select -First 20

Sunting: Saya merasa bahwa Anda akan bersikeras bahwa Anda hanya dapat menggunakan cmd.exe sekitar tahun 1989, tetapi itu tidak benar. Powershell dimasukkan ke dalam setiap versi OS Vista +, dan dapat diinstal pada XP / 2003. Ini adalah masa depan Windows.

Sunting: Baiklah, lakukan sesuai keinginan Anda.

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

Akan menampilkan 10 baris pertama dari output netstat.

Ryan Ries
sumber
5
Saya tidak ragu bahwa PowerShell adalah masa depan, tetapi saya membutuhkan sesuatu yang berfungsi, sekarang. Dalam kenyataan perusahaan, seringkali pelanggan departemen dukungan teknis kami memiliki ratusan server windows, tidak ada yang memiliki Vista, 7 atau 8. Saya tidak mungkin membuang waktu menginstal PowerShell setiap kali saya perlu menjalankan perintah, saya juga tidak bahkan diizinkan untuk.
giecsar
Cmd.exe itu adalah ...
Ryan Ries
yang mereka butuhkan hanyalah satu server w2k8r2 yang mereka BISA login untuk menjalankan perintah powershell, apakah itu mungkin?
tony roth
Saya tidak tahu apakah ada server 2K8, tetapi jawaban Ryan Ries adalah persis apa yang saya butuhkan. Terima kasih banyak, Ryan!
giecsar
1
Tolong jangan lupa untuk ... menandai jawabannya sebagai ... diterima ...: `( meringkuk dalam posisi janin di sudut dan terisak pada diri sendiri
Ryan Ries
8

Jika Anda tipe orang Unix, mungkin menginstal CygWin memberi Anda lingkungan yang lebih akrab.

vonbrand
sumber
2
Tidak, saya pikir saya sudah menjelaskannya, tetapi saya tidak dapat menginstal apa pun. Itu harus dijalankan dengan prosesor perintah Windows (cmd.exe). Tidak ada PowerShell, tidak ada CygWin, tidak ada skrip.
giecsar
3

Ada solusi mudah yang jauh lebih mudah daripada menggunakan forloop " ".

Mari kita ambil output dari dir/o-d( dirinvers -urut berdasarkan tanggal) sebagai contoh.

Misal, jika Anda ingin menampilkan garis 1 hingga 16, gunakan:

dir/o-d|findstr/n ^^|findstr "^[1-9]: ^1[0-6]:"

Misal, jika Anda ingin menghasilkan garis 16 hingga 45, gunakan:

dir/o-d|findstr/n ^^|findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:"

Output sampel:

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
...

Kerusakan:

  1. Pertama, buang seluruh output menggunakan dir/o-d.

  2. Selanjutnya, tambahkan setiap baris dengan " $Num:" menggunakanfindstr/n ^^

    • ^berarti cocok dengan garis awal, dan ^^ini hanyalah versi yang diperlukan karena kita dalam cmd.

    • Catatan: Anda perlu menggunakan findstrini karena find/n" "tidak akan cocok dengan garis tanpa spasi`.

  3. Terakhir, pangkas output menggunakan findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: adalah regex untuk 16 hingga 19.

    • ^[2-3][0-9]: adalah regex untuk 20 - 39.

    • ^4[0-5]: adalah regex untuk 40 hingga 45.

    • findstr "a b c"cara menemukan string yang cocok dengan ekspresi a, batau c.

Lihat juga /programming//q/8844868/632951

Pacerier
sumber
Itu solusi yang bagus, tetapi Anda sekarang memiliki nomor yang diawali di sana, dapatkah seseorang menyingkirkannya di panggilan findstr terakhir?
fschmitt
@ fschmitt, findstrtidak dapat menghapus sesuatu. Saya pikir Anda mungkin terpaksa menggunakan loop kemudian dalam kasus itu.
Pacerier
0

Ini adalah perintah satu baris, saya harap ini bekerja untuk Anda juga.

@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
sumber