grep mengecualikan beberapa string

116

Saya mencoba melihat file log menggunakan tail -fdan ingin mengecualikan semua baris yang berisi string berikut:

"Nopaging the limit is"`  and `"keyword to remove is"

Saya dapat mengecualikan satu string seperti ini:

tail -f admin.log|grep -v "Nopaging the limit is"

Tetapi bagaimana cara mengecualikan baris yang mengandung salah satu dari string1atau string2.

Jeets
sumber

Jawaban:

107

Dua contoh memfilter beberapa baris dengan grep:

Taruh ini di filename.txt:

abc
def
ghi
jkl

perintah grep menggunakan opsi -E dengan pipa antara token dalam string:

grep -Ev 'def|jkl' filename.txt

cetakan:

abc
ghi

Perintah menggunakan opsi -v dengan pipa antar token yang dikelilingi oleh tanda kurung:

egrep -v '(def|jkl)' filename.txt

cetakan:

abc
ghi
Eric Leschinski
sumber
15
Saya terkejut tidak ada yang berbicara tentang grep -v -e def -e jklmetode yang IMHO lebih jelas…
Frizlab
4
Atau bahkan lebih baik: grep -Fv -e def -e jklyang lebih cepat!
Frizlab
11
Dengan flag -F, Anda bisa menggunakan baris baru sebagai pembatas, bukan pipa. Hal ini memungkinkan penggunaan keluaran perintah sebagai filter dengan lebih mudah, misalnya:grep -vF $(pgrep myprocess)
Phlarx
45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F cocok dengan string literal (bukan ekspresi reguler)

-v membalikkan pertandingan

-e memungkinkan beberapa pola pencarian (semua literal dan terbalik)

bijak
sumber
1
Ini adalah jawaban yang benar: Satu-satunya yang menghindari grep -vcontoh ganda dan persyaratan buatan regex (memungkinkan beberapa string ditentukan dengan rapi dalam argumen terpisah). Bayangkan saja membuat regex itu secara terprogram dalam skrip untuk string yang dapat berisi apa saja…
user2394284
Sebenarnya tidak ada satupun dari ini adalah jawaban yang benar karena ketika melewatkan tidak ada kata kunci untuk mengecualikan itu akan mengecualikan semuanya, bukan tidak sama sekali.
Győri Sándor
37

Pilihan lainnya adalah membuat daftar pengecualian, ini berguna khususnya ketika Anda memiliki daftar panjang hal-hal untuk dikecualikan.

vi /root/scripts/exclude_list.txt

Sekarang tambahkan apa yang ingin Anda kecualikan

Nopaging the limit is
keyword to remove is

Sekarang gunakan grep untuk menghapus baris dari file log file Anda dan melihat informasi yang tidak dikecualikan.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log
rezizter
sumber
1
Saya tidak menyadari Anda dapat menggunakan -vdengan -f(atau yang terakhir bahkan ada).
Sridhar Sarnobat
sangat sangat berguna!
samaspin
Perhatikan, Anda tidak perlu membuat file sementara untuk daftar pengecualian. Dalam bash Anda dapat menggunakan substitusi proses. Ini berguna jika daftar pengecualian agak dinamis dan Anda harus membuatnya sebelum setiap penggunaan hanya untuk digunakan sekali:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav
22
egrep -v "Nopaging the limit is|keyword to remove is"
Stefan Podkowinski
sumber
15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
hs.chandra
sumber
11

Anda dapat menggunakan grep biasa seperti ini:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"

mikhail
sumber
1
Jawaban ini berhasil untuk saya di MacOSX.
Meloloskan
5

Grep bisa dirantai. Sebagai contoh:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"
Fidel
sumber
1
Tangkapannya di sini adalah bahwa alih-alih proses yang akan menyaring, Anda harus menjalankan N proses secara berurutan, di mana masing-masing dari mereka menyaring sesuatu. Itu bisa memperlambat segalanya secara signifikan.
Artem Oboturov