Windows tương đương với lệnh 'tail'


107

Có cách nào để mô phỏng lệnh đuôi * nix trên dòng lệnh Windows không? Tôi có một tệp và tôi muốn có một cách để cắt bớt n dòng văn bản đầu tiên . Ví dụ:

D:\>type file.txt
line one
line two
line three
D:\>*[call to tail]* > result.txt

D:\>type result.txt
line two
line three

10
Không headchỉ hiển thị n dòng đầu tiên thay vì bỏ chúng đi?
Joey

Vui lòng xem xét các câu trả lời mới của Chris kể từ năm 2009, cụ thể hơn là câu trả lời của Amit Portnoy . Vì câu hỏi của bạn là chung chung, nhiều người dùng có thể tìm thấy trang web này. Và họ có thể ngừng đọc câu trả lời sau câu trả lời đầu tiên: câu trả lời bạn đã chấp nhận. Bạn có thể thay đổi câu trả lời mà bạn đã chấp nhận thành một câu trả lời khác cập nhật hơn cho các khả năng hiện nay. Chúc mừng;)
olibre

Tôi hơi bối rối. Câu hỏi ban đầu là về headlệnh kiểu Unix , nhưng đầu ra mong muốn trông giống như mong muốn tail. Có vẻ như câu trả lời là về headvà không tail.
blakeoft

@blakeoft câu hỏi ban đầu là yêu cầu hành vi của tail, tuy nhiên tiêu đề cho biếthead
MM

Câu trả lời:


89

Không có tương đương chính xác. Tuy nhiên, tồn tại một lệnh DOS gốc "more" có tùy chọn + n sẽ bắt đầu xuất tệp sau dòng thứ n:

DOS Nhắc:

C:\>more +2 myfile.txt

Lệnh trên sẽ xuất ra mọi thứ sau 2 dòng đầu tiên.
Đây thực sự là nghịch đảo của Unix head :

Bảng điều khiển Unix:

root@server:~$ head -2 myfile.txt

Lệnh trên sẽ chỉ in 2 dòng đầu tiên của tệp.


8
Không, nó không giống nhau. tailbắt đầu đếm từ cuối tệp. Vì vậy, tail -2sẽ in ra hai dòng cuối cùng.
ADTC

5
Tôi có thể in n ký tự đầu tiên không?
Qwerty

Đuôi @ADTC (phiên bản của tôi) không hỗ trợ phủ định. only head does (gnuwin32)
nl-x

@ nl-x -2không phải là một phủ định. Nó chỉ là một phiên bản viết tắt của -n 2(số dòng). Thật không may, có quá nhiều triển khai tailkhông hỗ trợ -2, làm cho nó rất không phù hợp với các headtriển khai đi kèm . Nó đã làm tôi khó chịu quá nhiều lần.
ADTC

@ADTC À xin lỗi. Tôi đã nhầm lẫn với head -n -2cái nào khác với head -n 2. Nhưng với đuôi, đuôi không tồn tại.
nl-x

111

NẾU bạn đã cài đặt Windows PowerShell (tôi nghĩ nó được bao gồm từ XP), bạn chỉ có thể chạy từ cmd.exe:

Chỉ huy trưởng:

powershell -command "& {Get-Content *filename* -TotalCount *n*}"

Lệnh Đuôi:

powershell -command "& {Get-Content *filename* | Select-Object -last *n*}"

hoặc trực tiếp từ PowerShell:

Get-Content *filename* -TotalCount *n*
Get-Content *filename* | Select-Object -last *n*


cập nhật

Đã thêm lệnh PowerShell 3.0 (Windows 8 trở lên) Tailvới bí danh Last. HeadFirstbí danh TotalCountcũng đã được thêm vào.

Vì vậy, các lệnh có thể được viết lại dưới dạng

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*

Điều này không cư xử giống như headthay vì tail?
blakeoft

@blakeoft vâng, nó đã làm ... Tôi đã cập nhật câu trả lời của mình. Thật ngạc nhiên là phải mất 2 năm và 17 lượt bình chọn trước khi có người bình luận về điều này.
Amit Portnoy

@blakeoft mới nhận ra rằng câu hỏi đã được chỉnh sửa! (xem stackoverflow.com/posts/1295068/revisions). Nó ban đầu được hỏi cho lệnh đầu ... được cập nhật để bao gồm cả câu trả lời ...
Amit Portnoy

2
@AmitPortnoy Tôi đã tìm thấy một câu trả lời khác ở đâu đó trên sàn giao dịch ngăn xếp này nói rằng hiện Get-Contentcó lệnh đuôi. Ví dụ, Get-content -Tail 5 file.txtsẽ in năm dòng cuối cùng của file.txt. Cảm ơn đã cập nhật câu trả lời của bạn btw.
blakeoft

2
bất kỳ cách nào để sử dụng nó như một bộ lọc? (. ví dụ như đọc stdin thay vì tập tin)
eadmaster

24
more /e filename.txt P n

trong đó n = số hàng sẽ hiển thị. Hoạt động nhanh và chính xác như headlệnh.


14
Người dùng chỉ có thể nhập các lệnh như P, S, v.v. tại dấu nhắc. Chúng không thể được chuyển vào lệnh more. Vì vậy, ví dụ trên không hoạt động
Philibert Perusse


12

Đây là một cuộc tấn công hoàn toàn nhưng nếu đó là một tệp lớn mà bạn chỉ muốn kiểm tra định dạng, tiêu đề, v.v. và bạn đang tìm kiếm giải pháp, bạn luôn có thể chuyển hướng đầu ra 'thêm' đến một tệp mới và CTRL-C Mau. Các hàng đầu ra không thể được kiểm soát chính xác và bạn rất có thể sẽ giết nó ở giữa dòng đầu ra nhưng đó là một cách rẻ tiền để lấy một chút nhỏ của tệp không sử dụng được.

Ví dụ.

C: \ more test.csv> test.txt 
^ C C: \ more test.txt
dòng 1
dòng 2
v.v. C: \

9

Chà, điều này sẽ làm được , nhưng nó nhanh như vẻ bề ngoài (khoảng O (n * m), trong đó n là số dòng để hiển thị và m là tổng số dòng trong tệp):

for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" filename ^| findstr /r "^%l:"') do @echo %b

Trong đó "10" là số dòng bạn muốn in và "tên tệp" là tên của tệp.


6
+1 cho một giải pháp khiến bạn mất nhiều thời gian nhập hơn so với tải xuống một cổng head.
Camilo Martin

1
Lưu ý: Đặt biểu thức này trong dấu ngoặc - (expr) > out.txt- khi gửi kết quả tới tệp, nếu không bạn sẽ chỉ nhận được dòng cuối cùng. Hoặc nối thêm - expr >> out.txt.
cz

9

Powershell:

Get-Content C:\logs\result.txt -Tail 10

Get-Content C:\logs\result.txt -wait (monitor the tail)

Đây là câu trả lời chính xác, cập nhật và có liên quan (không giống như cmd). Cảm ơn.
cudacoder

7

Khi sử dụng thêm + n mà Matt đã đề cập, để tránh tạm dừng trong các tệp dài, hãy thử cách này:

thêm +1 myfile.txt> con

Khi bạn chuyển hướng đầu ra từ nhiều hơn, nó không tạm dừng - và ở đây bạn chuyển hướng đến bảng điều khiển. Tương tự, bạn có thể chuyển hướng đến một số tệp khác như thế này với việc tạm dừng nhiều tệp khác nếu đó là kết quả cuối cùng mong muốn của bạn. Sử dụng> để chuyển hướng đến tệp và ghi đè tệp nếu tệp đã tồn tại hoặc >> để nối vào tệp hiện có. (Có thể sử dụng một trong hai để chuyển hướng đến con.)



5

Get-content -Tail n file.txtvới powershell là thứ duy nhất gần gũi với taillinux.

Các Get-Content *filename* | Select-Object -last *n*đề xuất ở trên tải / phân tích cú pháp toàn bộ. Không cần phải nói, tôi không hài lòng với tệp nhật ký 10GB của mình ...-Tail Tùy chọn này bắt đầu ở cuối tệp.


2

Nếu bạn muốn lệnh head, một cách dễ dàng để lấy nó là cài đặt Cygwin. Sau đó, bạn sẽ có tất cả các công cụ UNIX theo ý của bạn.

Nếu đó không phải là một giải pháp tốt, thì bạn có thể thử sử dụng findstr và thực hiện tìm kiếm chỉ báo cuối dòng.

findstr trên MSDN: http://technet.microsoft.com/en-us/library/bb490907.aspx


2

Đây là một lệnh head gốc nhanh cung cấp cho bạn 9 dòng đầu tiên trong DOS.

findstr /n "." myfile.txt | findstr "^.:"

2 ký tự đầu tiên trên mỗi dòng sẽ là số dòng.



2

trong PS hãy thử sử dụng lệnh:

Select -Last 1

Lệnh này cũng có thể được pipelined.

Ví dụ để lấy dòng đầu tiên:

type .\out.txt | Select -Last 1

hoặc để lấy dòng đầu tiên:

 type .\out.txt | Select -First 1

1

FWIW, đối với những người chỉ cần cắt một số lượng bản ghi không xác định từ phần đầu của tệp, nhiều hơn> hoạt động tốt. Điều này hữu ích chỉ để có một tệp nhỏ hơn để làm việc trong giai đoạn đầu của quá trình phát triển thứ gì đó.


1

Tôi chưa thử giải nén một dải ô, nhưng tôi có thể nhận được một dòng bằng lệnh DOS sau:

find /N " " *.log|find "[6]" 

Vì hầu hết các tệp đều chứa khoảng trắng, lệnh này kéo mọi dòng từ tất cả các tệp LOG và về cơ bản đánh số chúng bắt đầu từ 1 cho mỗi tệp. Các kết quả được đánh số sau đó được đưa vào FINDlệnh thứ hai tìm kiếm dòng được gắn thẻ là số 6.


1

Có một headtiện ích miễn phí trên trang này mà bạn có thể sử dụng. Tôi vẫn chưa thử.


1
Không chắc tại sao điều này lại bị phản đối. Nó thực thi chính xác như tiện ích đầu UNIX.
coson

1
Đó là một liên kết tải xuống. Anh ta có phải uuencode nhị phân và nhúng nó vào câu trả lời không?
GargantuChet

0
set /p line= < file.csv 
echo %line%

nó sẽ trả về dòng đầu tiên của tệp của bạn trong cmd Windows trong biến% line%.


0

Như một câu trả lời đương đại, nếu chạy Windows 10, bạn có thể sử dụng "Hệ thống con Linux dành cho Windows".

https://docs.microsoft.com/en-us/windows/wsl/install-win10

Điều này sẽ cho phép bạn chạy các lệnh linux gốc từ bên trong các cửa sổ và do đó chạy đuôi chính xác như cách bạn làm trong linux.


-2

Tôi không nghĩ rằng có một lối thoát nào đó. Không có lệnh như vậy trong DOS và các tệp hàng loạt bị giới hạn để mô phỏng nó (không gây khó khăn lớn).


-2

Cảnh báo, việc sử dụng tệp hàng loạt cho, mã thông báo và khả năng phân tách trên đầu vào văn bản không xác định có thể là một thảm họa do cách diễn giải đặc biệt của các ký tự như &,!, <, V.v. Các phương pháp như vậy chỉ nên dành cho văn bản có thể dự đoán được.

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.