grep di dalam lebih sedikit?


58

Saat ini saya sedang memilah-milah banyak log yang tidak dikenal untuk mencari beberapa masalah. File pertama yang saya lihat adalah Events.log, dan saya mendapatkan setidaknya tiga halaman lessyang menampilkan acara yang sama pada waktu yang berbeda - suatu peristiwa yang tampaknya cukup jinak. Saya ingin menyaring acara ini, dan saat ini saya berhenti lessdan melakukan sesuatu seperti

grep -v "event text" Events.log | less

Ini sekarang membawa sejumlah peristiwa umum yang tidak menarik yang ingin saya saring. Apakah ada cara saya bisa grep -v dalam dari less? Daripada harus melakukan

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

Itu menurut saya sebagai fitur yang berguna ketika melihat segala jenis file log - dan jika lessbukan alatnya, adakah yang lain dengan kualitas yang saya cari? Hanya lesspenampil gaya dengan built in grep.

Jawaban:


91

lessmemiliki pencocokan pola yang sangat kuat. Dari halaman manual :

&pattern

    Hanya tampilkan garis yang cocok dengan pattern; garis yang tidak cocok dengan pattern tidak ditampilkan. Jika patternkosong (jika Anda mengetik &segera diikuti oleh ENTER), semua pemfilteran dimatikan, dan semua baris ditampilkan. Ketika pemfilteran sedang berlaku, ampersand ditampilkan di awal prompt, sebagai pengingat bahwa beberapa baris dalam file mungkin disembunyikan.

    Beberapa karakter khusus seperti pada /perintah :

    ^N atau !

      Tampilkan hanya garis yang TIDAK cocok dengan pattern.
    ^R
      Jangan menafsirkan metakarakter ekspresi reguler; yaitu, lakukan perbandingan tekstual sederhana.

    ____________
    Karakter tertentu spesial jika dimasukkan pada awal pattern; mereka memodifikasi jenis pencarian daripada menjadi bagian dari pattern.

   (Tentu saja ^Ndan masing-masing ^Rmewakili Ctrl+ N dan Ctrl+ R.) 

Jadi, misalnya, &dnshanya akan menampilkan garis yang cocok dengan pola dns, dan &!dnsakan menyaring (mengecualikan) garis-garis itu, hanya menampilkan garis yang tidak cocok dengan pola.

Tercatat dalam deskripsi /perintah itu

    Ini patternadalah ekspresi reguler, seperti yang dikenali oleh pustaka ekspresi reguler yang disediakan oleh sistem Anda.

Begitu

  • &eth[01]  akan menampilkan garis yang berisi eth0ataueth1
  • &arp.*eth0akan menampilkan baris yang berisi arpdiikuti oleheth0
  • &arp|dns  akan menampilkan garis yang berisi arpataudns

Dan !dapat membalikkan salah satu di atas. Jadi perintah yang ingin Anda gunakan untuk contoh dalam pertanyaan Anda adalah:

&!event text|something else|the other thing|foo|bar

Juga gunakan dan untuk mencari (dan / untuk pergi ke yang berikutnya / sebelumnya)./pattern?patternnN


1
Ini hampir sampai! Dalam less, menggunakan '&! <1stpattern>' memungkinkan saya untuk 'menyembunyikan' garis dengan pola aktif, namun itu hanya berlaku untuk satu pola pada suatu waktu, jadi jika saya menemukan pola kedua dan menerapkan '&! <2ndpattern>', garis yang cocok dengan pola pertama dan disembunyikan, sekarang terlihat. Sangat dekat!
Forquare

@forquare: Ada riwayat perintah yang dapat Anda akses dengan tombol panah atas & bawah. Jadi tekan &!lalu tekan tombol panah.
PM 2Ring

@forquare: Dan saya baru saja menemukan bahwa sejarah disimpan, sehingga pola lama Anda akan tersedia saat berikutnya Anda menjalankan less; Saya tidak tahu apakah itu dipertahankan setelah reboot.
PM 2Ring

1
@orion itu adalah bit terakhir yang saya lewatkan - bagaimana menggabungkan pola bersama. Saya pikir saya telah mencoba simbol pipa sebelumnya dan gagal, tetapi sekarang saya coba lagi itu berhasil! Jadi: &! <pattern1> | <pattern2> | <pattern3> akan menghapus garis dengan pattern1 atau pattern2 atau pattern3
forquare

1
Saya menemukan jawabannya. Homebrew dupes memiliki versi terbaru. Saya hanya perlu menendang bash karena itu tidak mengambil file yang tepat (meskipun yang mengatakan kepada saya itu meraih / pengguna / lokal / bin / kurang).
spinlock

7

Membangun jawaban orion , less(1)halaman manual menjelaskan

/pattern

    Cari maju dalam file untuk baris ke- N yang berisi pattern.  N default ke 1. Ini patternadalah ekspresi reguler, seperti yang dikenali oleh pustaka ekspresi reguler yang disediakan oleh sistem Anda. Pencarian dimulai pada baris kedua yang ditampilkan (tetapi lihat opsi -adan -j, yang mengubah ini).

    Beberapa karakter khusus jika dimasukkan pada awal pattern; mereka memodifikasi jenis pencarian daripada menjadi bagian dari pattern:

    ^N atau !

      Cari baris yang TIDAK cocok dengan pattern.
    ^E atau *
      Cari banyak file. Yaitu, jika pencarian mencapai AKHIR dari file saat ini tanpa menemukan kecocokan, pencarian berlanjut di file berikutnya dalam daftar baris perintah.
    ^F atau @
      Mulailah pencarian di baris pertama file PERTAMA dalam daftar baris perintah, terlepas dari apa yang saat ini ditampilkan di layar atau pengaturan opsi -aatau -j.
    ^K
      Sorot teks apa pun yang cocok dengan patternpada layar saat ini, tetapi jangan pindah ke pertandingan pertama (KEEP posisi saat ini).
    ^R
      Jangan menafsirkan metakarakter ekspresi reguler; yaitu, lakukan perbandingan tekstual sederhana.

    ____________
    Perintah dapat didahului dengan angka desimal, yang disebut N dalam deskripsi ...

   (Tentu saja ^Ndan ^E, dll., Mewakili Ctrl+ Ndan Ctrl+ E, dll.) 

Ternyata itu dan bekerja sama dengan baik. Misalnya, perintahnya&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

diketik dalam rangka baik, akan menyembunyikan (mengecualikan) semua baris yang mengandung arpatau dns(seperti grep -v), dan kemudian, dalam garis yang tersisa, sorot semua kejadian fail, fatal, fault, atau apapun yang terlihat seperti nama perangkat SCSI ( sd[a-z][0-9]). Perhatikan bahwa baris yang mengandung arpatau dns, dan juga failatau kata-kata bahaya lainnya, tidak akan ditampilkan.


2

Selama beberapa bulan terakhir, saya menjadi agak terpikat fzf.

Dalam kasus Anda, asalkan konteks tidak diperlukan (yaitu, setara dengan grep ini -A, -Batau -Ctidak diperlukan, dan omong-omong, kurang yang &juga memiliki keterbatasan yang sama), maka fzf adalah alat yang sangat kuat.

Ini contoh konyolnya:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

Jika Anda menjalankannya, dan bermain dengan input seperti aa | bb dd | ee !gg !hhdan sebagainya, Anda akan dengan cepat melihat apa yang terjadi.

Dokumentasi Fzf tentang |operator jarang, tetapi tebakan terbaik saya adalah itu hanya berlaku untuk persyaratan segera sebelum dan sesudah, yang berarti, pada dasarnya, bahwa ATAU diutamakan daripada AND (yang tersirat ; semua persyaratan AND-ed secara default) . Tetapi dalam kebanyakan kasus ini seharusnya tidak menjadi masalah, dan semuanya berjalan baik dalam pengalaman saya.

Cobalah. Saya telah menemukannya sangat berguna ketika datang untuk menelusuri hal-hal ketika saya tidak benar-benar yakin apa yang saya cari, dan ketika konteks tidak masalah.

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.