grep dengan operator logika


19

Apakah ada utilitas seperti grep yang memungkinkan saya melakukan pencarian grep dengan operator logika. Saya ingin dapat bersarang dan menggabungkan konstruksi logis secara bebas. Misalnya, hal-hal seperti ini harus dimungkinkan:

grep (term1 && term2) || (term1 && (term3 xor term4)) *

Saya menyadari ini dapat dilakukan dengan vanilla grep dan skrip bash tambahan, tetapi tujuan saya di sini adalah untuk menghindari keharusan melakukan itu.

grep 

Jawaban:


12

Dengan awk, seperti halnya perl, Anda harus //memasukkan istilah , tetapi itu bisa dilakukan:

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

28

Ada banyak cara untuk digunakan grepdengan operator logis.

  1. Gunakan \|untuk memisahkan beberapa pola untuk kondisi OR .

    Contoh: grep 'pattern1\|pattern2' filename

  2. Gunakan -Eopsi untuk mengirim beberapa pola untuk kondisi ATAU .

    Contoh: grep -E 'pattern1|pattern2' filename

  3. Menggunakan satu -epencocokan hanya satu pola, tetapi menggunakan beberapa -eopsi cocok dengan lebih dari satu pola.

    Contoh: grep -e pattern1 -e pattern2 filename

  4. grep -vdapat mensimulasikan operasi BUKAN .

  5. Tidak ada operator AND di dalamnya grep, tetapi Anda dapat mensimulasikan dengan kasar dan menggunakan -Eopsi.

    Contoh: grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    Contoh di atas akan cocok dengan semua baris yang berisi pattern1 dan pattern2 dalam urutan apa pun.)


1
-Etidak cukup setara dengan &&karena itu sensitif terhadap pesanan
iruvar

grep foo | grep baradalah cara yang lebih umum untuk melakukan DAN.
Kenster

2
+1 memberi penjelasan yang jelas bahwa tidak ada operator "DAN" yang sesungguhnya, dan yang terbaik yang bisa kita lakukan adalah mensimulasikan peretasan menggunakan struktur ATAU. Ini tentu saja akan menjadi berat dengan lebih dari 3 istilah, tetapi untuk dua istilah itu berfungsi dengan baik.
Eric Hepperle - CodeSlayer2010

grep -c -e MATCH1 -e MATCH2 bagus ketika Anda tertarik dengan jumlah nama file.
andrej

4

Anda bisa menggunakan perl:

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'

0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

Saya percaya itu memenuhi apa yang Anda coba lakukan. Ini dmenghapus dari output setiap baris yang tidak cocok term1, itu branches keluar dari skrip (dan cetak ulang otomatis) setiap baris yang tersisa dan yang cocok term2, dan untuk baris yang tetap itu menghapus yang tidak cocok term3dan dari mereka yang cocok term4.

sed skrip dievaluasi secara berurutan, dan semua tes adalah boolean, sehingga tindakan apa pun yang dihasilkan dari tes akan secara langsung mempengaruhi perilaku tindakan berikut.


0

Saya gunakan untuk mengaitkan grepperintah untuk mencapai logika DAN:

grep expr1 filename | grep expr2

Saya percaya itu sangat mudah, seperti Unix dan elegan.


Kemudian Anda dapat menggabungkan (seperti yang dijelaskan oleh @Tushi dengan seksama) dengan -Eopsi untuk OR dan -vuntuk meniadakan.

Contoh spesifik Anda cukup jahat dan mungkin akan mendapat manfaat dari beberapa utilitas yang lebih kuat (lihat jawaban @ muru).

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.