Làm thế nào để thực hiện những gì head, tail, more, less, sed làm trong Powershell? [đóng cửa]


109

Trên cửa sổ, sử dụng Powershell, các lệnh tương đương là gì để linux của head, tail, more, lesssed?


tệp nhật ký quá lớn, khoảng vài MByte. Quá khó để xem bởi notepad.exe.
Yue Zhang

Nếu bạn đang sử dụng notepadlàm cơ sở của mình, tôi khuyên bạn nên xem xét các trình soạn thảo văn bản thay thế, có rất nhiều lựa chọn thay thế (cả miễn phí và trả phí). Tất cả đều vượt trội so với notepad (mặc dù đó không phải là thách thức nhiều).
Richard

có thể trùng lặp của PowerShell so với Unix Shells
manojlds

Tôi xử lý các tệp lớn và tôi sử dụng / cài đặt Vim cho thấy tốc độ nhanh hơn nhiều so với bất kỳ công cụ nào khác mà tôi đã sử dụng.
sfanjoy

Câu trả lời:


174

Get-Content(bí danh gc:) là tùy chọn thông thường của bạn để đọc tệp văn bản. Sau đó, bạn có thể lọc thêm:

gc log.txt | select -first 10 # head
gc -TotalCount 10 log.txt     # also head
gc log.txt | select -last 10  # tail
gc -Tail 10 log.txt           # also tail (since PSv3), also much faster than above option
gc log.txt | more             # or less if you have it installed
gc log.txt | %{ $_ -replace '\d+', '($0)' }         # sed

Điều này hoạt động đủ tốt cho các tệp nhỏ, các tệp lớn hơn (hơn một vài MiB) có thể hơi chậm.

Các Extensions Cộng đồng PowerShell bao gồm một số lệnh cho chuyên thứ tập tin (ví dụ như Get-FileTail).


3
Chúa ơi, đây là mức tối đa CPU của tôi để thực hiện -last 2trên CSV 1GB. Đồ uống nóng: ☕
mlissner

9
@mlissner: Nếu bạn đang sử dụng PowerShell v3, bạn có thể sử dụng Get-Content -Tail 2thay thế. Điều đó chắc chắn nhanh hơn.
Joey

gc log.txt | %{ $_ -replace '\d+', '($0)' } # sedđó không thực sự hoàn toàn là công cụ sed vì nó không đưa nội dung trở lại. Nó cần Set-Content.
Artyom

3
@Neil, -Lastchậm vì cùng một lý do awksẽ chậm cho cùng một tác vụ: Trước tiên, nó phải tiêu thụ luồng hoàn toàn. Đó là lý do Get-Content -Tailtồn tại. Và không có headbởi vì nó không phù hợp với các quy ước đặt tên, và mục đích của nó đã được phục vụ bởi Select-Item.
Joey

3
@neil @joey Họ có bí danh cho -head. Xem câu trả lời của tôi stackoverflow.com/a/41626586/1081043
Wisbucky

52

Dưới đây là những cách tích hợp để làm headtail. Không sử dụng đường dẫn vì nếu bạn có một tệp lớn, nó sẽ cực kỳ chậm. Sử dụng các tùy chọn tích hợp này sẽ cực kỳ nhanh chóng ngay cả đối với các tệp lớn.

gc log.txt -head 10 
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f

nhưng bình luận của Joey dường như chỉ ra điều hoàn toàn ngược lại! làm cách nào để biết ai nên tin tưởng hoặc phương pháp (tích hợp sẵn) nào hiệu quả nhất?
NH.

2
@NH Câu trả lời của tôi phù hợp với nhận xét của Joey. Nhận xét của anh ấy nói "-Rất chậm ... Đó là lý do tại sao Get-Content -Tail tồn tại." | select -lastsử dụng đường ống. Tôi đang sử dụng -tailmà không có đường ống. Nhưng nếu bạn tìm thấy hai câu trả lời trái ngược nhau, bạn có thể tin tưởng người có uy tín cao hơn nhiều. Ngoài ra, bạn có thể chỉ cần thử hai phương pháp trên một tệp lớn. Nó sẽ rất rõ ràng trên một tệp lớn.
khôn ngoan,

Hiểu rồi. Xin lỗi, tôi chắc đã bối rối lần đầu tiên tôi đọc các bài viết.
NH.

8

more.exetồn tại trên Windows, lessdễ dàng tìm thấy các cổng (và Phần mở rộng Cộng đồng PowerShell , PSCX, bao gồm một).

PowerShell không thực sự cung cấp bất kỳ sự thay thế nào cho các chương trình riêng biệt, nhưng đối với dữ liệu Out-Gridcó cấu trúc có thể hữu ích.

HeadTailcả hai đều có thể được mô phỏng bằng Select-Objectcách sử dụng các tham số -First-Lasttương ứng.

Sedtất cả các chức năng đều có sẵn nhưng được cấu trúc khá khác nhau. Các tùy chọn lọc có sẵn trong Where-Object(hoặc qua Foreach-Objectvà một số trạng thái cho các phạm vi). Các hoạt động khác, chuyển đổi, có thể được thực hiện với Select-ObjectForeach-Object.

Tuy nhiên, khi PowerShell chuyển các đối tượng (.NET) - với tất cả cấu trúc đã nhập của chúng, ví dụ. ngày tháng vẫn là các DateTimephiên bản - thay vì chỉ là các chuỗi, mà mỗi lệnh cần tự phân tích cú pháp, phần lớn sedvà các chương trình như vậy là dư thừa.


Xuất sắc. gc dường như không hỗ trợ đầu vào đường ống. khi tôi muốn lọc đầu ra của một lệnh, tôi đang sử dụng" ... exe ... | chọn đối tượng -đầu tiên 20 | chọn đối tượng -last 1"
A117

2

"-TotalCount" trong trường hợp này phản hồi chính xác như "-head". Bạn phải sử dụng -TotalCount hoặc -head để chạy lệnh như vậy. Nhưng -TotalCount gây hiểu lầm - nó không hoạt động THỰC SỰ cung cấp cho bạn BẤT KỲ số lượng nào ...

gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt

Tập lệnh trên, được thử nghiệm trong PS 5.1 là phản hồi CÙNG như bên dưới ...

gc -head 25 C:\scripts\logs\robocopy_report.txt

Vì vậy, sau đó chỉ cần sử dụng "-head 25" đã!


Xin chào @Patrick, chào mừng bạn đến với Stack Overflow! Cảm ơn bạn đã cố gắng trả lời câu hỏi này, bạn có thể vui lòng cung cấp lời giải thích chi tiết hơn được không? Không rõ bạn đang cố gắng đưa ra giải pháp hay chỉ thêm một số nhận xét về vấn đề.
Rocío García Luque

Đó là một nhận xét và cũng là một sự thất vọng. '-TotalCount" không làm gì '-Head' không đã làm Vì vậy, không ai biết làm thế nào để có được một TOTALCOUNT.?
Patrick Burwell

Đọc lại ... tôi đã thêm vào câu trả lời và làm rõ những gì hoạt động ...
Patrick Burwell

1

Nếu bạn cần truy vấn các tệp nhật ký lớn (hoặc nhỏ) trên Windows, công cụ tốt nhất mà tôi tìm thấy là Log Parser 2.2 miễn phí của Microsoft . Bạn có thể gọi nó từ PowerShell nếu bạn muốn và nó sẽ thực hiện tất cả các công việc nặng nhọc cho bạn và cũng rất nhanh.


dù sao cũng cảm ơn, Môi trường của tôi là Win2k8R2 không có trong Yêu cầu hệ thống của Log Parser2.2
Yue Zhang

0

Tôi có một số giải pháp tốt hơn:

gc log.txt -ReadCount 5 | %{$_;throw "pipeline end!"} # head
gc log.txt | %{$num=0;}{$num++;"$num $_"}             # cat -n
gc log.txt | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed

-1
$Push_Pop = $ErrorActionPreference #Suppresses errors
$ErrorActionPreference = SilentlyContinue #Suppresses errors
#Script
    #gc .\output\*.csv -ReadCount 5 | %{$_;throw "pipeline end!"} # head
    #gc .\output\*.csv | %{$num=0;}{$num++;"$num $_"}             # cat -n
    gc .\output\*.csv | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed
#End Script 
$ErrorActionPreference = $Push_Pop #Suppresses errors

Bạn không gặp phải tất cả các lỗi với mã pushpop BTW, mã của bạn chỉ hoạt động với tùy chọn "sed". Tất cả phần còn lại bỏ qua bất cứ điều gì ngoài gc và đường dẫn.

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.