grep bên trong ít?


58

Tôi hiện đang sàng lọc rất nhiều nhật ký lạ để tìm kiếm một số vấn đề. Tệp đầu tiên tôi xem là Events.log và tôi nhận được ít nhất ba trang trong lessđó xuất hiện để hiển thị cùng một sự kiện vào các thời điểm khác nhau - một sự kiện có vẻ khá lành tính. Tôi muốn lọc sự kiện này và hiện tại tôi đã thoát lessvà làm một cái gì đó như

grep -v "event text" Events.log | less

Điều này bây giờ mang lại một số sự kiện phổ biến, không thú vị khác mà tôi cũng muốn lọc ra. Có cách nào tôi có thể grep -v bên trong của less? Thay vì phải làm

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

Nó tạo cho tôi một tính năng hữu ích khi xem bất kỳ loại tệp nhật ký nào - và nếu lesskhông phải là công cụ, liệu có một tính năng nào khác mà tôi tìm kiếm không? Chỉ cần một lessngười xem phong cách với tích hợp grep.

Câu trả lời:


91

lesscó mẫu phù hợp rất mạnh mẽ. Từ trang người đàn ông :

&pattern

    Chỉ hiển thị các dòng phù hợp với pattern; những dòng không khớp với pattern sẽ không được hiển thị. Nếu patterntrống (nếu bạn nhập &ngay lập tức theo sau ENTER), mọi bộ lọc sẽ bị tắt và tất cả các dòng được hiển thị. Trong khi lọc có hiệu lực, một dấu và được hiển thị ở đầu dấu nhắc, như một lời nhắc nhở rằng một số dòng trong tệp có thể bị ẩn.

    Một số ký tự đặc biệt như trong /lệnh :

    ^N hoặc là !

      Chỉ hiển thị các dòng KHÔNG khớp với pattern.
    ^R
      Đừng diễn giải các siêu ký tự biểu thức chính quy; đó là, làm một so sánh văn bản đơn giản.

    ____________
    Một số nhân vật đặc biệt nếu lọt vào vị trí đầu pattern; họ sửa đổi loại tìm kiếm hơn là trở thành một phần của pattern.

   (Tất nhiên ^N^Rđại diện cho Ctrl+ NCtrl+ R, tương ứng.) 

Vì vậy, ví dụ, &dnssẽ chỉ hiển thị các dòng khớp với mẫu dns&!dnssẽ lọc ra (loại trừ) các dòng đó, chỉ hiển thị các dòng không khớp với mẫu.

Nó được ghi chú trong phần mô tả /lệnh

    Đây patternlà một biểu thức chính quy, được công nhận bởi thư viện biểu thức chính quy do hệ thống của bạn cung cấp.

Vì thế

  • &eth[01]  sẽ hiển thị các dòng chứa eth0hoặceth1
  • &arp.*eth0sẽ hiển thị các dòng chứa arptheo sau bởieth0
  • &arp|dns  sẽ hiển thị các dòng chứa arphoặcdns

!có thể đảo ngược bất kỳ điều nào ở trên. Vì vậy, lệnh bạn muốn sử dụng cho ví dụ trong câu hỏi của bạn là:

&!event text|something else|the other thing|foo|bar

Cũng sử dụng và để tìm kiếm (và / để đi tới / trước)./pattern?patternnN


1
Điều này gần như ở đó! Trong less, sử dụng '&! <1stpotype>' cho phép tôi 'ẩn' các dòng với một mẫu trên, tuy nhiên, nó chỉ áp dụng cho một mẫu tại một thời điểm, vì vậy nếu tôi tìm thấy mẫu thứ hai và áp dụng '&! <2ndpotype>', các dòng khớp với mẫu đầu tiên và đã bị ẩn, hiện có thể nhìn thấy. Rất gần!
forapes

@forapes: Có một lịch sử lệnh mà bạn có thể truy cập bằng các phím mũi tên lên & xuống. Vì vậy, nhấn &!và sau đó nhấn một phím mũi tên.
PM 2Ring

@forapes: Và tôi vừa phát hiện ra rằng lịch sử đã được lưu, vì vậy các mẫu cũ của bạn sẽ có sẵn vào lần tới khi bạn chạy less; Tôi không biết nếu nó được bảo quản sau khi khởi động lại, mặc dù.
PM 2Ring

1
@orion đó là bit cuối cùng tôi bị thiếu - làm thế nào để ghép các mẫu lại với nhau. Tôi mặc dù tôi đã thử biểu tượng ống trước đó và nó đã thất bại, nhưng bây giờ tôi thử lại nó hoạt động! Vì vậy: &! <Mẫu1> | <mẫu2> | <mẫu3> sẽ xóa các dòng có mẫu1 hoặc mẫu2 hoặc mẫu3
forapes

1
Tôi đã hiểu rồi. Homebrew dupes có phiên bản mới nhất. Tôi chỉ phải đá bash vì nó không lấy đúng tệp (mặc dù điều đó cho tôi biết đó là lấy / user / local / bin / less).
spinlock

7

Dựa trên câu trả lời của orion , less(1)trang người đàn ông mô tả

/pattern

    Tìm kiếm chuyển tiếp trong tệp cho dòng N -th chứa pattern.  N mặc định là 1. patternlà một biểu hiện thường xuyên, như được công nhận bởi các thư viện biểu thức chính quy được cung cấp bởi hệ thống của bạn. Tìm kiếm bắt đầu ở dòng thứ hai được hiển thị (nhưng xem -a-jcác tùy chọn, thay đổi này).

    Một số nhân vật là đặc biệt nếu được nhập vào đầu pattern; họ sửa đổi loại tìm kiếm thay vì trở thành một phần của pattern:

    ^N hoặc là !

      Tìm kiếm các dòng KHÔNG khớp với pattern.
    ^E hoặc là *
      Tìm kiếm nhiều tập tin. Nghĩa là, nếu tìm kiếm đạt đến KẾT THÚC của tệp hiện tại mà không tìm thấy kết quả khớp, tìm kiếm sẽ tiếp tục trong tệp tiếp theo trong danh sách dòng lệnh.
    ^F hoặc là @
      Bắt đầu tìm kiếm ở dòng đầu tiên của tệp FIRST trong danh sách dòng lệnh, bất kể những gì hiện đang hiển thị trên màn hình hoặc cài đặt của -ahoặc -jtùy chọn.
    ^K
      Đánh dấu bất kỳ văn bản nào phù hợp với patternmàn hình hiện tại, nhưng không di chuyển đến trận đấu đầu tiên (vị trí hiện tại KEEP).
    ^R
      Đừng diễn giải các siêu ký tự biểu thức chính quy; đó là, làm một so sánh văn bản đơn giản.

    ____________
    lệnh có thể được đi trước bởi một số thập phân, được gọi là N trong giới thiệu ...

   (Tất nhiên ^N^E, v.v., đại diện cho Ctrl+ NCtrl+ E, v.v.) 

Nó chỉ ra rằng và làm việc tốt với nhau. Ví dụ: các lệnh&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

gõ vào một trong hai thứ tự, sẽ ẩn (loại trừ) tất cả các dòng có chứa arphoặc dns(như grep -v), và sau đó, trong các dòng còn lại, đánh dấu tất cả các lần xuất hiện của fail, fatal, fault, hoặc bất cứ điều gì đó trông giống như tên của một thiết bị SCSI ( sd[a-z][0-9]). Lưu ý rằng các dòng có chứa arphoặc dns, hoặc cũng failnhư bất kỳ từ nguy hiểm nào khác sẽ không được hiển thị.


2

Trong vài tháng qua, tôi đã trở nên hơi say mê fzf.

Trong trường hợp của bạn, miễn là bối cảnh là không cần thiết (ví dụ, tương đương với grep của -A, -Bhoặc -Clà không cần thiết, và bằng cách này, ít nhân &cũng có giới hạn tương tự), sau đó fzf là một công cụ rất mạnh mẽ.

Đây là một ví dụ ngớ ngẩn:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

Nếu bạn chạy nó và chơi với các đầu vào như aa | bb dd | ee !gg !hhthế, bạn sẽ nhanh chóng thấy những gì đang xảy ra.

Tài liệu của Fzf về |toán tử rất thưa thớt, nhưng tôi đoán tốt nhất là nó chỉ áp dụng cho các điều khoản ngay trước và sau, điều đó có nghĩa là, OR có quyền ưu tiên hơn AND ( mặc định là tất cả các thuật ngữ đều được AND-ed theo mặc định) . Nhưng trong hầu hết các trường hợp, đây không phải là một vấn đề và mọi thứ diễn ra tốt đẹp theo kinh nghiệm của tôi.

Cho nó một shot. Tôi đã tìm thấy nó hữu ích đáng ngạc nhiên khi nói đến việc duyệt tìm mọi thứ khi tôi không thực sự chắc chắn những gì tôi đang tìm kiếm và khi bối cảnh không quan trọng.

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.