Pertanyaan Lihat file tanpa baris dengan string tertentu


Mencari program seperti tail atau less yang membiarkan saya melihat log saya tanpa garis yang berisi string tertentu. Misalnya lihat syslog saya tanpa UFW ([UFW BLOCK]) jalur masuk.


12
2017-07-27 12:56


asal


Meskipun tidak mudah memberikan solusi untuk deskripsi masalah Anda yang sebenarnya dengan fitur ini, Anda mungkin tertarik untuk mengetahuinya less menawarkan kemungkinan untuk memfilter garis yang ditampilkan setelah pola regex. Anda dapat menggunakan fitur ini dengan mengetik & diikuti oleh pola, dan Anda dapat mengembalikannya dengan mengetik & sendirian. - Aaron


Jawaban:


Pola ini cocok dengan opsi inversi -v untuk grep sangat membantu untuk ini:

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

Ini akan menunjukkan kepada Anda semua baris tidak mengandung UFW BLOCK. Sebagai grep menggunakan ekspresi reguler dasar secara default, penyertaan braket akan membuatnya mencari karakter individual apa pun dari 'UFW BLOCK' termasuk ruang. Anda mungkin akan berakhir tanpa keluaran. Jika Anda perlu memastikan bahwa ada tanda kurung di sekitar tali, lepaskan mereka \[UFW BLOCK\], atau gunakan -F opsi dari grep untuk hanya menyertakan string tetap (Terima kasih kepada Zanna dan Steeldriver untuk saran tentang ini):

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

Anda dapat membuatnya lebih mudah untuk dilihat dengan mem-pipe output ke pager seperti less:

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

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

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

13
2017-07-27 12:59



Anda juga bisa menggunakan fgrep perintah yang setara dengan grep -F . - Tulains Córdova
@ TulainsCórdova grep's man mengatakan bahwa "Direct invocation sebagai egrep atau fgrep tidak digunakan lagi, tetapi disediakan untuk memungkinkan aplikasi historis yang bergantung padanya untuk berjalan tanpa modifikasi". Saya tidak tahu apakah mereka akan bertindak atas penghentian ini, tetapi saya kira menggunakan perintah ini bukanlah praktik terbaik - Aaron


Anda juga bisa menggunakan sed's d perintah untuk menghapus garis dengan pola dari aliran:

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

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


5
2017-07-27 13:12





Anda dapat menggunakan alat apa pun dengan kemampuan pengeditan. Anda sudah diberi solusi menggunakan grep dan sed, di sini ada beberapa pilihan lain. Semua ini dapat dengan mudah disalurkan less atau more atau sesuatu yang lain.

  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
    

5
2017-07-27 13:24





Kamu dapat memakai awk terlalu:

awk '!/PATTERN/' log

Saya menggunakannya ketika saya memiliki lebih dari satu "pola" dan saya tidak ingin menggunakan dua grep seperti:

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

yang sintaksnya adalah:

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

2
2017-07-27 13:26



"Saya menggunakannya ketika saya punya lebih dari satu" pola "dan saya tidak ingin menggunakan dua grep seperti" ------ grep -Ev "foo|bar"? - αғsнιη
Anda juga bisa menggunakan -e untuk menentukan beberapa pola. grep -v -e 'foo' -e 'bar' - Arronical
@AFSHIN (Tidak tahu bagaimana komentar saya dihapus), maksud saya untuk logis dan tidak atau;) - Ravexina


Dengan less komando & pilihan itu mungkin untuk menyaring untuk menampilkan hanya pola yang cocok yang diinginkan seperti di bawah ini,

& /PATTERN/

dalam kasus Anda jika Anda ingin menyaring garis UFW BLOCK untuk tidak menampilkan dalam output, Anda hanya bisa menggunakan &! seperti di bawah ini:

&! /UFW BLOCK/

1
2017-07-27 15:53