Bắt trận đấu cuối cùng trong một tệp bằng grep


58

Cách tốt nhất để chỉ nhận được kết quả khớp cuối cùng của biểu thức chính quy trong tệp bằng grep là gì?

Ngoài ra, có thể bắt đầu grepping từ cuối tập tin thay vì bắt đầu và dừng lại khi tìm thấy kết quả khớp đầu tiên không?

Câu trả lời:


85

Bạn có thể thử

grep pattern file | tail -1

hoặc là

tac file | grep pattern | head -1

hoặc là

tac file | grep -m1 pattern

20
tac file | grep -m 1 pattern
Dennis Williamson

1
Với các ràng buộc được thêm vào mà tôi muốn lấy số dòng ( grep -n) trong tệp thực tế, tôi nghĩ rằng taccần phải tránh khá nhiều, trừ khi tôi muốn thực hiện một số phép trừ wc -l. Nếu không tacvới grep -m1làm cho rất nhiều ý nghĩa.
Nick Merrill

1
Tôi muốn thấy một phiên bản hiệu suất cao hơn phiên bản này, vì tôi đang cố gắng tìm kiếm một tệp 20 GB.
Jeff

Câu trả lời của @DennisWilliamson tốt hơn nhiều vì grepsẽ ngừng hoạt động sau trận đấu đầu tiên. không có -m 1, greptrước tiên sẽ tìm thấy tất cả các mẫu phù hợp trong tệp , sau đó headsẽ chỉ hiển thị mẫu đầu tiên - kém hiệu quả hơn nhiều. Dennis, xin vui lòng xem xét đăng bài này trong một câu trả lời riêng!
gilad mayani

1

Dành cho ai đó làm việc với các tệp văn bản lớn trong Unix / Linux / Mac / Cygwin. Nếu bạn sử dụng Windows, hãy kiểm tra điều này về các công cụ Linux trong Windows: https://stackoverflow.com/questions35319738/what-is-the-best-way-to-use-linux-utilities-under-windows .

Người ta có thể làm theo quy trình công việc này để có hiệu suất tốt:

  1. nén bằng gzip
  2. sử dụng zindex (trên github: https://github.com/mattgodbolt/zindex ) để lập chỉ mục tệp với khóa thích hợp
  3. truy vấn tệp được lập chỉ mục với zqtừ gói.

Trích dẫn từ github readme của nó:

Tạo một chỉ mục

zindex cần được cho biết phần nào của mỗi dòng tạo thành chỉ mục. Điều này có thể được thực hiện bằng một biểu thức chính quy, theo trường hoặc bằng cách đặt từng dòng thông qua một chương trình bên ngoài.

Theo mặc định, zindex tạo một chỉ mục của file.gz.zindex khi được yêu cầu lập chỉ mục file.gz.

Thí dụ:

tạo một chỉ mục trên các dòng khớp với một biểu thức chính quy số. Nhóm chụp cho biết phần được lập chỉ mục và các tùy chọn hiển thị mỗi dòng có một chỉ mục số duy nhất.

$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique

Ví dụ: tạo một chỉ mục trên trường thứ hai của tệp CSV:

$ zindex file.gz --delimiter , --field 2 

Thí dụ:

tạo một chỉ mục trên trường JSON orderId.id trong bất kỳ mục nào trong mảng hành động của tài liệu gốc (yêu cầu jq). Truy vấn jq tạo ra một mảng của tất cả các orderId.ids, sau đó kết hợp chúng với một khoảng trắng để đảm bảo mỗi dòng riêng lẻ được chuyển đến jq tạo một dòng đầu ra duy nhất, với nhiều kết quả được phân tách bằng khoảng trắng (là dấu phân cách mặc định).

$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'" 

Truy vấn chỉ mục

Chương trình zq được sử dụng để truy vấn một chỉ mục. Nó được đặt tên của tệp nén và danh sách các truy vấn. Ví dụ:

$ zq file.gz 1023 4443 554 

Cũng có thể xuất theo số dòng, vì vậy để in các dòng 1 và 1000 từ một tệp:

$ zq file.gz --line 1 1000

1

Tôi luôn luôn sử dụng mèo (nhưng điều này làm cho nó dài hơn một chút): cat file | grep pattern | tail -1

Tôi sẽ đổ lỗi cho giáo viên khóa học quản trị linux của tôi ở trường đại học yêu mèo :))))

- Bạn không cần phải gửi một tập tin trước khi gre nó. grep pattern file | tail -1và hiệu quả hơn, quá.


6
Đây chỉ là phần đầu tiên trong câu trả lời của Cakemox, ngoại trừ tệ hơn.
tám

Nó hoạt động, nhưng nó làm các bước không cần thiết. Đối với việc sử dụng ánh sáng, giải pháp này hoạt động tốt, nhưng nó không hoạt động tốt. Lý do là bởi vì bạn không cần phải cattập tin và dẫn nó đến grep. Bạn có thể đã greptìm kiếm tệp trực tiếp qua grep pattern file(và sau đó sử dụng tailđể trả về kết quả cuối cùng), như trong câu trả lời của Cakemox.
jvriesem
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.