Xem tệp không có dòng với chuỗi nhất định


12

Tìm kiếm một chương trình như tailhoặc lesscho phép tôi xem nhật ký của mình mà không có dòng nào chứa một chuỗi nhất định. Ví dụ xem syslog của tôi mà không có [UFW BLOCK]dòng nhập UFW ( ).


Mặc dù không dễ để cung cấp giải pháp cho mô tả vấn đề chính xác của bạn với tính năng này, bạn có thể muốn biết rằng lesscung cấp khả năng lọc các dòng được hiển thị sau một mẫu biểu thức chính quy. Bạn có thể sử dụng tính năng này bằng cách gõ &theo mẫu và bạn có thể hoàn nguyên nó bằng cách gõ &một mình.
Aaron

Câu trả lời:


13

Tùy chọn đảo ngược mẫu -vcho grepthực sự hữu ích cho việc này:

grep -v 'UFW BLOCK' /var/log/syslog

Điều này sẽ cho bạn thấy tất cả các dòng không chứa UFW BLOCK. Vì grepsử dụng các biểu thức chính quy cơ bản theo mặc định, việc bao gồm các dấu ngoặc sẽ làm cho nó tìm kiếm bất kỳ ký tự riêng lẻ nào của 'UFW BLOCK' bao gồm cả khoảng trắng. Có lẽ bạn sẽ không có đầu ra. Nếu bạn cần đảm bảo rằng có các dấu ngoặc quanh chuỗi, hãy thoát chúng \[UFW BLOCK\]hoặc sử dụng -Ftùy chọn grepchỉ bao gồm các chuỗi cố định (Cảm ơn ZannaSteeldo về lời khuyên về điều này):

grep -Fv '[UFW BLOCK]' /var/log/syslog

Bạn có thể làm cho việc xem dễ dàng hơn bằng cách chuyển đầu ra tới máy nhắn tin như less:

grep -v 'UFW BLOCK' /var/log/syslog | less

Hoặc chuyển hướng đầu ra đến một tệp trong thư mục chính của bạn để xem sau:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
Bạn cũng có thể sử dụng fgreplệnh tương đương với grep -F.
Tulains Córdova

2
Người đàn ông của @ TulainsCórdova nói rằng "Yêu cầu trực tiếp như egrep hoặc fgrep không được chấp nhận, nhưng được cung cấp để cho phép các ứng dụng lịch sử dựa vào chúng chạy không được sửa đổi". Tôi không biết liệu họ có bao giờ hành động vì sự phản đối này không, nhưng tôi đoán sử dụng các lệnh này không phải là cách thực hành tốt nhất
Aaron

5

Bạn cũng có thể sử dụng sed's dlệnh để xóa các dòng với mô hình từ các dòng:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

Chúng tôi thoát []như bình thường họ biểu thị một lớp nhân vật, có nghĩa là "khớp bất cứ thứ gì bên trong đây"


5

Bạn có thể sử dụng bất kỳ công cụ có khả năng chỉnh sửa. Bạn đã được đưa ra giải pháp bằng cách sử dụng grepsed, đây là một vài lựa chọn khác. Tất cả những có thể dễ dàng được đường ống để lesshoặc morehoặc bất cứ điều gì khác.

  1. Perl

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    Vì đây là Perl, TIMTOWDI! .

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. ôi

    awk '!/\[UFW BLOCK\]/' file
    

2

Bạn cũng có thể sử dụng awk:

awk '!/PATTERN/' log

Tôi sử dụng nó khi tôi có nhiều hơn một "mẫu" và tôi không muốn sử dụng hai grepkiểu như:

... | grep -v foo | grep -v bar

cú pháp là:

awk '!/PATTERN/ && !/PATTERN2/' log

"Tôi sử dụng nó khi tôi có nhiều hơn một" mẫu "và tôi không muốn sử dụng hai grep như" ------ grep -Ev "foo|bar"?
αғsнιη

Bạn cũng có thể sử dụng -eđể xác định nhiều mẫu. grep -v -e 'foo' -e 'bar'
Arronical

@AFSHIN (Không biết bình luận của tôi bị xóa như thế nào), ý tôi là hợp lý và không hay;)
Ravexina

1

Với tùy chọn lesscủa lệnh, &có thể lọc ra để chỉ hiển thị mẫu phù hợp mong muốn như bên dưới,

& /PATTERN/

trong trường hợp của bạn nếu bạn muốn các dòng bộ lọc UFW BLOCKkhông hiển thị ở đầu ra, bạn chỉ cần sử dụng &!như dưới đây:

&! /UFW BLOCK/
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.