Jangan mencoba menggunakan grep untuk ini, gunakan awk sebagai gantinya. Untuk mencocokkan 2 regexps R1 dan R2 di grep, Anda akan mengira:
grep 'R1.*R2|R2.*R1'
sementara di awk itu akan menjadi:
awk '/R1/ && /R2/'
tetapi bagaimana jika R2tumpang tindih dengan atau merupakan subset dari R1? Perintah grep itu tidak akan berfungsi sementara perintah awk akan berhasil. Katakanlah Anda ingin menemukan garis yang berisi thedan heat:
$ echo 'theatre' | grep 'the.*heat|heat.*the'
$ echo 'theatre' | awk '/the/ && /heat/'
theatre
Anda harus menggunakan 2 greps dan pipa untuk itu:
$ echo 'theatre' | grep 'the' | grep 'heat'
theatre
dan tentu saja jika Anda benar-benar meminta mereka untuk terpisah Anda selalu dapat menulis dalam awk regexp yang sama seperti yang Anda gunakan dalam grep dan ada solusi awk alternatif yang tidak melibatkan pengulangan regexps dalam setiap urutan yang mungkin.
Kesampingkan itu, bagaimana jika Anda ingin memperluas solusi Anda untuk mencocokkan 3 regexps R1, R2, dan R3. Dalam grep itu akan menjadi salah satu pilihan yang buruk ini:
grep 'R1.*R2.*R3|R1.*R3.*R2|R2.*R1.*R3|R2.*R3.*R1|R3.*R1.*R2|R3.*R2.*R1' file
grep R1 file | grep R2 | grep R3
sementara di awk itu akan menjadi singkat, jelas, sederhana, efisien:
awk '/R1/ && /R2/ && /R3/'
Sekarang, bagaimana jika Anda benar-benar ingin mencocokkan string literal S1 dan S2, bukan regexps R1 dan R2? Anda tidak bisa melakukan itu dalam satu panggilan ke grep, Anda harus menulis kode untuk menghindari semua meteor RE sebelum memanggil grep:
S1=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R1')
S2=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R2')
grep 'S1.*S2|S2.*S1'
atau lagi gunakan 2 greps dan pipa:
grep -F 'S1' file | grep -F 'S2'
yang lagi-lagi adalah pilihan yang buruk sedangkan dengan awk Anda cukup menggunakan operator string daripada operator regexp:
awk 'index($0,S1) && index($0.S2)'
Sekarang, bagaimana jika Anda ingin mencocokkan 2 regexps dalam sebuah paragraf daripada sebuah baris? Tidak bisa dilakukan di grep, sepele di awk:
awk -v RS='' '/R1/ && /R2/'
Bagaimana dengan seluruh file? Sekali lagi tidak dapat dilakukan dalam grep dan sepele dalam awk (kali ini saya menggunakan awk GNU untuk multi-char RS untuk keringkasan tetapi tidak lebih banyak kode dalam awk atau Anda dapat memilih kontrol-char yang Anda tahu tidak akan menjadi input bagi RS untuk melakukan hal yang sama):
awk -v RS='^$' '/R1/ && /R2/'
Jadi - jika Anda ingin menemukan beberapa regexps atau string dalam satu baris atau paragraf atau file maka jangan gunakan grep, gunakan awk.