Grep trong một tệp nhật ký khổng lồ (> 14 GB) chỉ x GB cuối cùng?


34

Tôi cần tìm kiếm thứ gì đó trong một tệp nhật ký khổng lồ (hơn 14 GB). Tôi khá chắc chắn rằng nó trong 4 GB gần nhất.

Có cách nào để bỏ qua X GB đầu tiên để tăng tốc mọi thứ không?


7
LC_ALL=C grepcó thể tăng tốc nó lên
jfs

1
Bạn sẽ có thể nhận được rất nhiều tốc độ bằng cách chọn một grepbiểu thức hợp lý ... các ký tự đại diện có độ dài không xác định (như a.*thing) trong một số trường hợp sẽ mất nhiều thời gian hơn để đánh giá. Có thể là bạn đang tối ưu hóa cho điều sai (mặc dù không bao giờ đau đớn khi chỉ tìm kiếm một phần của tệp, rõ ràng - nó có thể không phải là nguồn tăng tốc lớn nhất).
Floris

Câu trả lời:


75

Tôi đoán bạn có thể sử dụng đuôi để chỉ xuất ra 4GB cuối cùng hoặc lâu hơn bằng cách sử dụng công -ctắc

-c, --bytes = [+] NUM
xuất ra các byte cuối cùng; hoặc sử dụng -c + NUM để xuất bắt đầu bằng byte NUM của mỗi tệp

Bạn có thể cũng có thể làm một cái gì đó với dd bằng cách đặt bs=1skiping vào phần bù bạn muốn bắt đầu, vd

dd if=file bs=1024k skip=12g | grep something

83
Sau đó, bạn nên cấu hình logrotate.
Gerald Schneider

3
@Rogier Vui lòng thêm câu trả lời với giải pháp thay vì thêm nó vào câu hỏi của bạn. Điều này tương tự như tự trả lời: serverfault.com/help/elf-answer
AL

5
@istheEnglishway: Chà, không, họ đã đăng một lệnh khác.
Cuộc đua nhẹ nhàng với Monica

11
Nhưng câu trả lời của bạn không cung cấp lệnh thực tế thực hiện giải pháp đó, đó là giá trị gia tăng. Bạn có thể chỉnh sửa câu trả lời của mình hoặc OP có thể đăng nó dưới dạng câu trả lời mới. Họ chắc chắn không nên thêm nó vào câu hỏi, đó là những gì đã xảy ra. Và bạn chắc chắn không nên ném xung quanh các biểu tượng như "chọc mũi vào".
Cuộc đua nhẹ nhàng với Monica

7
@istheEnglishway, tin hay không có một ví dụ giúp mọi việc dễ dàng hơn là phải đọc trang nam (xem thêm: tài liệu stackoverflow)
Pierre.Sassoulas

32

Tôi chỉ đăng bài này vì một số ý kiến ​​yêu cầu.

Những gì tôi kết thúc bằng cách sử dụng (tệp 15 GB). Nó làm việc rất nhanh và tiết kiệm cho tôi rất nhiều thời gian.

tail -f -c 14G file | grep something

Tôi cũng đã làm một điểm chuẩn rất thô sơ trên cùng một tập tin. Tôi đã thử nghiệm:

tập tin grep xxx
// mất mãi mãi (> 5 phút)

dd if = tập tin bs = 1 bỏ qua = 14G | grep xxx
// rất nhanh <1 giây

đuôi -c 14g | grep xxx
// khá nhanh <2 giây

những tailchỉ là một chút ngắn hơn.

NB: hậu tố được sử dụng gGkhác nhau cho mỗi lệnh (Ubuntu 15.10)


Bạn đã xóa bộ nhớ cache đĩa giữa các điểm chuẩn? Tôi nghi ngờ hầu hết thời gian trong lần đầu tiên là I / O. Việc tăng tốc phải theo thứ tự 15 ×, không phải 300 ×.
Reid

2
@Reid tôi đã không. Nhưng tôi đã chạy từng lệnh nhiều lần. Tôi khá chắc chắn rằng dd hoặc đuôi sẽ tăng tốc độ đáng kể so với chỉ grep (bộ nhớ cache hoặc không).
Roger

19

Điều này không trả lời câu hỏi Tiêu đề, nhưng nó sẽ làm những gì bạn muốn làm. Sử dụng tac để đảo ngược tệp, sau đó sử dụng grep để tìm chuỗi của bạn. Nếu chuỗi của bạn chỉ xảy ra một lần hoặc một số lần đã biết trong tệp, thì hãy để nó chạy cho đến khi tìm thấy số lần xuất hiện đã biết. Bằng cách đó, nếu giả định của bạn về vị trí của tệp trong tệp không chính xác, nó vẫn sẽ tìm thấy nó. Nếu bạn muốn hạn chế nó, bạn có thể sử dụng đầu để làm điều đó. Lệnh head sẽ đi giữa tac và grep.

Vì vậy, lệnh trông giống như:

tac < logfile | grep myString

1
Tôi đến đây để viết câu trả lời chính xác. Tôi ngạc nhiên không ai ủng hộ bạn.
Dmitry Grigoryev

2
Mất một phút, nhưng rồi tôi rên rỉ vì chơi chữ ... tac ngược lại với con mèo.
Sammi

1
Tôi cần phải đào xung quanh trong một bản ghi ứng dụng / gỡ lỗi . Bởi vì nó đảo ngược các dòng, nó không dễ đọc hơn ;-) Tuy nhiên, có vẻ rất nhanh. Chưa bao giờ thấy tac, cảm ơn!
Roger
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.