Làm cách nào để hiển thị N dòng đầu tiên của đầu ra lệnh trong Windows? (tương đương với lệnh Unix đầu vào đầu)


17

Tôi cần một lệnh tương đương với headlệnh Unix (hiển thị N dòng đầu tiên của đầu ra). Đây là những gì tôi đang sử dụng hiện tại:

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

Đoạn mã trên hiển thị 10 dòng tasklistđầu ra đầu tiên. find /N " "thêm một số dòng vào đầu mỗi dòng trong khi findstr /r \[[0-9]\]trích xuất 10 dòng đầu tiên bằng regex.

Mã trên hoạt động, nhưng tôi cần chỉ định bất kỳ phạm vi . Do thực tế là các biểu thức thông thường không được triển khai theo các tiêu chuẩn trong Windows, tôi không thể làm gì khác để làm việc.

Làm cách nào để trích xuất các dòng tùy ý từ đầu ra cmd? Điều quan trọng là phải làm điều này với một lớp lót. Không có kịch bản!


.....................
giecsar

Câu trả lời:


36

Quyền hạn.

PS C:\> netstat | Select -First 20

Chỉnh sửa: Tôi có cảm giác rằng bạn sẽ nhấn mạnh rằng bạn chỉ có thể sử dụng cmd.exe vào khoảng năm 1989, nhưng điều đó không đúng. Powershell được đưa vào mọi phiên bản HĐH Vista + và có thể cài đặt trên XP / 2003. Đó tương lai của Windows.

Chỉnh sửa: Được rồi, có cách của bạn.

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

Sẽ hiển thị 10 dòng đầu tiên của đầu ra của netstat.


5
Tôi không có nghi ngờ rằng PowerShell là tương lai, nhưng tôi cần một cái gì đó hoạt động ngay bây giờ. Trong thực tế doanh nghiệp, thường khách hàng của bộ phận hỗ trợ công nghệ của chúng tôi có hàng trăm máy chủ windows, không ai trong số đó có Vista, 7 hoặc 8. Tôi không thể lãng phí thời gian để cài đặt PowerShell mỗi khi tôi cần chạy lệnh, tôi cũng không thậm chí ủy quyền cho.
giecsar

Cmd.exe đó là ...
Ryan Ries

tất cả những gì họ cần là một máy chủ w2k8r2 mà họ CÓ THỂ đăng nhập để chạy lệnh powershell, điều đó có thể không?
tony roth 28/03/13

Tôi không biết có máy chủ 2K8 không, nhưng câu trả lời của Ryan Ries chính xác là những gì tôi cần. Cảm ơn Ryan rất nhiều!
giecsar

1
Xin đừng quên ... đánh dấu câu trả lời là ... được chấp nhận ...: `( cuộn tròn trong tư thế của thai nhi trong góc và khóc nức nở
Ryan Ries

8

Nếu bạn là người thuộc loại Unix, có lẽ việc cài đặt CygWin mang đến cho bạn một môi trường quen thuộc hơn.


2
Không, tôi nghĩ rằng tôi đã làm cho nó rõ ràng, nhưng tôi không thể cài đặt bất cứ điều gì. Nó phải chạy với bộ xử lý lệnh Windows (cmd.exe). Không PowerShell, không CygWin, không có tập lệnh.
giecsar

3

Có một giải pháp dễ dàng dễ dàng hơn nhiều so với sử dụng forvòng lặp "".

Hãy lấy đầu ra từ dir/o-d( dirngược thứ tự theo ngày) làm ví dụ.

Ví dụ: nếu bạn muốn xuất dòng 1 đến 16, hãy sử dụng:

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

Ví dụ: nếu bạn muốn xuất dòng 16 đến 45, hãy sử dụng:

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

Đầu ra mẫu:

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

Phá vỡ:

  1. Đầu tiên, đổ toàn bộ đầu ra bằng cách sử dụng dir/o-d.

  2. Tiếp theo, hãy thêm trước mỗi dòng bằng " $Num:" bằng cách sử dụngfindstr/n ^^

    • ^có nghĩa là bắt đầu khớp dòng và ^^đơn giản là phiên bản thoát được yêu cầu vì chúng tôi đang ở cmd.

    • Lưu ý: bạn cần sử dụng findstrcho việc này vì find/n" "sẽ không khớp các dòng không có dấu cách`.

  3. Cuối cùng, cắt đầu ra bằng cách sử dụng findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: là regex cho 16 đến 19.

    • ^[2-3][0-9]: là regex cho 20 - 39.

    • ^4[0-5]: là regex cho 40 đến 45.

    • findstr "a b c"phương tiện tìm chuỗi mà phù hợp với một trong hai biểu thức a, bhoặc c.

Đồng thời xem /programming//q/8844868/632951


Đó là một giải pháp tốt, nhưng bây giờ bạn có số tiền tố ở đó, người ta có thể thoát khỏi chúng trong cuộc gọi tìm kiếm cuối cùng không?
fschmitt

@fschmitt, findstrkhông thể xóa mọi thứ. Tôi nghĩ rằng bạn có thể bị buộc phải sử dụng một vòng lặp sau đó trong trường hợp đó.
Pacerier

0

Đây là một lệnh một dòng, tôi hy vọng nó cũng hiệu quả với bạn.

@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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.