GNU/Linux >> Belajar Linux >  >> Linux

grep untuk istilah dan mengecualikan istilah lain

Untuk dan ekspresi dengan grep Anda memerlukan dua doa:

grep -Ei "search term" | grep -Eiv "exclude term"

Jika istilah yang Anda telusuri bukan ekspresi reguler, gunakan pencocokan string tetap (-F ) mana yang lebih cepat:

grep -F "search term" | grep -Fv "exclude term"

Singkat memohon grep dua kali, hanya ada satu cara yang dapat saya pikirkan untuk mencapai ini. Ini melibatkan Ekspresi Reguler yang Kompatibel dengan Perl (PCRE) dan beberapa pernyataan melihat-lihat yang agak retas.

Untuk menelusuri foo mengecualikan kecocokan yang berisi bilah , Anda dapat menggunakan:

grep -P '(?=^((?!bar).)*$)foo'

Begini cara kerjanya:

  • (?!bar) cocok dengan apa pun yang bukan bar tanpa mengkonsumsi karakter dari string. Lalu . menggunakan satu karakter.

  • ^((?!bar).)* mengulangi hal di atas dari awal string (^ ) sampai akhir ($ ). Ini akan gagal jika bar ditemui pada titik tertentu, sejak (?!bar) tidak akan cocok.

  • (?=^((?!bar).)*$) memastikan string cocok dengan pola sebelumnya, tanpa menggunakan karakter dari string.

  • foo menelusuri foo seperti biasa.

Saya menemukan retasan ini dalam ekspresi Reguler untuk mencocokkan string yang tidak mengandung kata?. Dalam jawaban Bart Kiers, Anda dapat menemukan penjelasan yang jauh lebih mendetail tentang cara kerja pandangan negatif ke depan.


Jika Anda ingin melakukan ini dalam sekali jalan, Anda dapat menggunakan awk daripada grep.

Format:

echo "some text" | awk '/pattern to match/ && !/pattern to exclude/'

Contoh:

  • echo "hello there" | awk '/hello/ && !/there/'

Tidak mengembalikan apa pun.

  • echo "hello thre" | awk '/hello/ && !/there/'

Pengembalian:halo tiga

  • echo "hllo there" | awk '/hello/ && !/there/'

Tidak mengembalikan apa pun.

Untuk beberapa pola, Anda dapat menggunakan tanda kurung untuk mengelompokkannya.

Contoh:

  • echo "hello thre" | awk '(/hello/ || /hi/) && !/there/'

Pengembalian:halo tiga

  • echo "hi thre" | awk '(/hello/ || /hi/) && !/there/'

Pengembalian:hai tiga

  • echo "hello there" | awk '(/hello/ || /hi/) && !/there/'

Tidak mengembalikan apa pun.

  • echo "hi there" | awk '(/hello/ || /hi/) && !/there/'

Tidak mengembalikan apa pun.


Linux
  1. Linux mencari kata dan menampilkan seluruh baris

  2. Pemisah bidang default untuk awk

  3. Bagaimana cara Menggabungkan find dan grep untuk pencarian yang kompleks? ( GNU/linux, temukan, grep )

  1. Panduan Bash For Loop dan Contohnya

  2. Menggunakan grep vs awk

  3. Cara menangkap kata tertentu dan mengambil teks

  1. Membungkus Perintah Yang Termasuk Kutipan Tunggal Dan Ganda Untuk Perintah Lain?

  2. Grep Untuk Beberapa String Dalam File, Dan Kemudian Buat Daftar File Dalam Urutan Ukuran?

  3. Gunakan Perintah Grep Dan Cari?