Làm cách nào tôi có thể sử dụng grep để hiển thị các dòng mà KHÔNG CÓ một trong hai chuỗi cụ thể?


8

Đối với tệp nhật ký lớn, làm cách nào để hiển thị các dòng đó mà không "thành công" hoặc không kết thúc bằng "ok"?


7
grep -Ev '(success|ok$)'
jordanm

@jordanm cũng sẽ đề nghị như vậy. Đây là một câu trả lời mặc dù và nên được đặt trong phần bên phải.
Valentin Bajrami ngày

@jordanm tuyệt vời, xin vui lòng làm cho nó một câu trả lời
Lee

Câu trả lời:


15

Để xóa các dòng có chứa một trong hai chuỗi, cụ thể bằng grep:

  • Trong một lệnh, mỗi bình luận của jordanm:

    grep -Ev 'success|ok$'
    

    hoặc là:

    grep -ve success -e 'ok$'
    

    hoặc là:

    grep -v 'success
    ok$'
    
  • Trong hai lệnh:

    grep -v success file | grep -v 'ok$'

Thí dụ:

$ cat file
success something else
success ok
just something else

$ grep -Ev 'success|ok$'
just something else
$ grep -v success file | grep -v 'ok$'
just something else

Để xóa các dòng có chứa cả hai chuỗi, cụ thể bằng grep:

grep -v 'success.*ok$' file

Thí dụ:

$ cat file
success something else
success ok
just something else

$ grep -v 'success.*ok$' file
success something else
just something else

thay vào đó, nếu jordanm muốn trả lời, tôi sẽ xóa cái này.
Jeff Schaller

Không, điều này là tốt.
jordanm

1
Lee, tôi thấy bạn đã chấp nhận câu trả lời này, nhưng tôi muốn làm rõ - những greps này sẽ loại bỏ các dòng có chứa một trong hai chuỗi đó; bạn có muốn xóa chỉ những dòng chứa cả "thành công" và kết thúc bằng "ok" không?
Jeff Schaller

Không, không phải cả hai.
Lee

cảm ơn đã làm rõ; hãy xem bản chỉnh sửa gần đây nhất cho câu hỏi của bạn để đảm bảo nó nói lên ý của bạn.
Jeff Schaller

2

Tôi sẽ thử

awk '/success/ { next ; } /ok$/ { next ; } { print ;}' file

Ở đâu

  • /success/ { next ; }tìm từ successvà bỏ qua dòng
  • /ok$/ { next ; }tìm chữ thường okvà bỏ qua dòng
  • { print ;} ẩn khác: dòng in

theo đề nghị

awk ngắn (nhờ Stéphane Chazelas)

awk '!/success/ && !/ok$/'

về cơ bản là không (thành công) và không (ok ở cuối dòng)

golf awk (cảm ơn cas)

awk '! /success|ok$/'

sử dụng lại regrec và phủ nhận nó


Ngay cả khi điều này hoạt động, đó không phải là một câu trả lời cho câu hỏi.
Quora Feans

1
Vâng, đó là một cách khác.
Lee

@Lee: nó không phải là một thay thế. Nó không đáp ứng điều kiện "sử dụng grep to."
Quora Feans

4
awk '!/success/ && !/ok$/'sẽ kinh điển hơn.
Stéphane Chazelas

1
hoặc thậm chíawk '! /success|ok$/'
cas


0

Kể từ khi awk được đề cập, một sự thay thế khác sẽ là sed:

sed '/success/d;/ok$/d' file
sed -e '/success/d' -e '/ok$/d' file

hoặc (sed mới hơn và POSIX trong tương lai) nhờ Stéphane Chazelas

sed -E '/success|ok$/d' file

1
Nếu bạn thay đổi sed -rthành sed -E, thì nó sẽ hoạt động trong một số BSD sedngoài (các phiên bản không quá cũ của) GNU sed. sed -Esẽ là vấn đề chính tiếp theo của thông số POSIX.
Stéphane Chazelas
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.