Lihat file tanpa garis dengan string tertentu


12

Mencari program seperti tailatau lessyang memungkinkan saya melihat log saya tanpa garis yang berisi string tertentu. Sebagai contoh, lihat syslog saya tanpa [UFW BLOCK]baris entri UFW ( ).


Meskipun tidak mudah untuk memberikan solusi untuk deskripsi masalah Anda dengan fitur ini, Anda mungkin tertarik untuk mengetahui bahwa lessmenawarkan kemungkinan untuk menyaring garis yang ditampilkan setelah pola regex. Anda dapat menggunakan fitur ini dengan mengetik &diikuti oleh pola, dan Anda dapat mengembalikannya dengan mengetikkan &saja.
Aaron

Jawaban:


13

Pilihan pola pertandingan inversi -vuntuk grepbenar-benar membantu untuk ini:

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

Ini akan menampilkan semua baris yang tidak mengandung UFW BLOCK. Seperti grepmenggunakan ekspresi reguler dasar secara default, dimasukkannya tanda kurung akan membuatnya mencari salah satu karakter individu dari 'UFW BLOCK' termasuk ruang. Anda mungkin berakhir tanpa hasil. Jika Anda perlu memastikan bahwa ada tanda kurung di sekeliling string, lepaskan dari mereka \[UFW BLOCK\], atau gunakan -Fopsi grephanya menyertakan string tetap (Terima kasih kepada Zanna dan Steeldriver untuk sarannya tentang ini):

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

Anda dapat membuatnya lebih mudah untuk dilihat dengan menyalurkan output ke pager seperti less:

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

Atau redirect output ke file di direktori home Anda untuk dilihat nanti:

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

2
Anda juga dapat menggunakan fgrepperintah yang setara dengan grep -F.
Tulains Córdova

2
@ TulainsCórdova pria grep mengatakan bahwa "Doa langsung baik sebagai egrep atau fgrep sudah usang, tetapi disediakan untuk memungkinkan aplikasi historis yang bergantung pada mereka untuk menjalankannya tidak dimodifikasi". Saya tidak tahu apakah mereka akan bertindak atas penghinaan ini, tapi saya kira menggunakan perintah ini bukan praktik terbaik
Aaron

5

Anda juga dapat menggunakan sed's dperintah untuk menghapus baris dengan pola dari sungai:

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

Kami melarikan diri []seperti biasanya mereka menunjukkan kelas karakter, yang berarti "cocokkan apa pun di dalam sini"


5

Anda dapat menggunakan alat apa pun dengan kemampuan mengedit. Anda telah diberi solusi menggunakan grepdan sed, berikut adalah beberapa pilihan lain. Semua ini dapat dengan mudah disalurkan ke lessatau moreatau apa pun.

  1. Perl

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

    Karena ini 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. awk

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

2

Anda juga bisa menggunakan awk:

awk '!/PATTERN/' log

Saya menggunakannya ketika saya punya lebih dari satu "pola" dan saya tidak ingin menggunakan dua grepseperti:

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

yang sintaksnya adalah:

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

"Aku menggunakannya ketika aku punya lebih dari satu" pola "dan aku tidak ingin menggunakan dua grep seperti" ------ grep -Ev "foo|bar"?
αғsнιη

Anda juga dapat menggunakan -euntuk mendefinisikan beberapa pola. grep -v -e 'foo' -e 'bar'
Arronik

@AFSHIN (Tidak tahu bagaimana komentar saya dihapus), saya maksudkan untuk yang logis dan tidak atau;)
Ravexina

1

Dengan opsi lessperintah &itu mungkin untuk menyaring untuk menampilkan hanya pola yang cocok yang diinginkan seperti di bawah ini,

& /PATTERN/

dalam kasus Anda jika Anda ingin garis filter dengan UFW BLOCKtidak ditampilkan dalam output, Anda bisa menggunakan &!seperti di bawah ini:

&! /UFW BLOCK/
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.