Saya mencoba menggunakan grep
untuk mencocokkan garis yang berisi dua string berbeda. Saya telah mencoba yang berikut tetapi ini cocok dengan baris yang berisi string1 atau string2 yang bukan yang saya inginkan.
grep 'string1\|string2' filename
Jadi bagaimana cara mencocokkan grep
hanya dengan garis yang berisi kedua string ?
Jawaban:
Kamu bisa memakai
grep 'string1' filename | grep 'string2'
Atau,
grep 'string1.*string2\|string2.*string1' filename
sumber
grep -e "string1" -e "string2"
Saya pikir ini yang Anda cari:
Saya pikir jawabannya seperti ini:
hanya cocok dengan kasus di mana keduanya ada, bukan satu atau yang lain atau keduanya.
sumber
grep -e "string1" -e "string2" filename
melakukan hal yang sama?How do I match lines that contains *both* strings?
Untuk mencari file yang mengandung semua kata dalam urutan apa pun di mana saja:
Grep pertama memulai pencarian rekursif (
r
), mengabaikan case (i
) dan daftar (mencetak) nama file yang cocok (l
) untuk satu istilah ('action'
dengan tanda kutip tunggal) yang terjadi di mana saja dalam file.Greps selanjutnya mencari istilah-istilah lain, mempertahankan ketidakpekaan huruf besar dan mencantumkan file-file yang cocok.
Daftar akhir file yang akan Anda dapatkan adalah file-file yang berisi istilah-istilah ini, dalam urutan apa pun di dalam file tersebut.
sumber
grep -ril 'foo' | xargs -d '\n' grep -il 'bar'
Jika Anda memiliki
grep
dengan-P
pilihan untuk terbatasperl
regex, Anda dapat menggunakanyang memiliki keuntungan bekerja dengan string yang tumpang tindih. Ini agak lebih mudah menggunakan
perl
sebagaigrep
, karena Anda dapat menentukan dan logika lebih langsung:sumber
Metode Anda hampir bagus, hanya melewatkan -w
sumber
grep -V
.grep -w 'regexp1\|regexp2' filename
The
|
operator dalam ekspresi reguler berarti atau. Artinya string1 atau string2 akan cocok. Anda bisa melakukannya:yang akan menyalurkan hasil dari perintah pertama ke grep kedua. Itu seharusnya memberi Anda hanya garis yang cocok dengan keduanya.
sumber
Anda dapat mencoba sesuatu seperti ini:
sumber
Dan seperti yang disarankan orang perl dan python, dan skrip shell yang berbelit-belit, berikut pendekatan awk yang sederhana :
Setelah melihat komentar pada jawaban yang diterima: tidak, ini tidak multi-line; tapi kemudian bukan itu yang diminta oleh penulis pertanyaan itu.
sumber
Jangan mencoba menggunakan grep untuk ini, gunakan awk sebagai gantinya. Untuk mencocokkan 2 regexps R1 dan R2 di grep, Anda akan mengira:
sementara di awk itu akan menjadi:
tetapi bagaimana jika
R2
tumpang tindih dengan atau merupakan subset dariR1
? Perintah grep itu tidak akan berfungsi sementara perintah awk akan berhasil. Katakanlah Anda ingin menemukan garis yang berisithe
danheat
:Anda harus menggunakan 2 greps dan pipa untuk itu:
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:
sementara di awk itu akan menjadi singkat, jelas, sederhana, efisien:
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:
atau lagi gunakan 2 greps dan pipa:
yang lagi-lagi adalah pilihan yang buruk sedangkan dengan awk Anda cukup menggunakan operator string daripada operator regexp:
Sekarang, bagaimana jika Anda ingin mencocokkan 2 regexps dalam sebuah paragraf daripada sebuah baris? Tidak bisa dilakukan di grep, sepele di awk:
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):
Jadi - jika Anda ingin menemukan beberapa regexps atau string dalam satu baris atau paragraf atau file maka jangan gunakan grep, gunakan awk.
sumber
awk '/R1/ && /R2/'
case-insensitive?awk -v IGNORECASE=1 '/R1/ && /R2/'
dan dengan awkawk '{x=toupper($0)} x~/R1/ && x~/R2/'
GNU grep versi 3.1
sumber
Ditemukan garis yang hanya dimulai dengan 6 spasi dan selesai dengan:
sumber
Katakanlah kita perlu mencari hitungan beberapa kata dalam file testfile. Ada dua cara untuk melakukannya
1) Gunakan perintah grep dengan pola pencocokan regex
2) Gunakan perintah egrep
Dengan egrep Anda tidak perlu khawatir tentang ekspresi dan hanya memisahkan kata-kata dengan pemisah pipa.
sumber
git grep
Berikut ini sintaks yang digunakan
git grep
dengan beberapa pola:Anda juga dapat menggabungkan pola dengan ekspresi Boolean seperti
--and
,--or
dan--not
.Periksa
man git-grep
bantuan.Params lain yang perlu dipertimbangkan:
Untuk mengubah jenis pola, Anda juga dapat menggunakan
-G
/--basic-regexp
(default),-F
/--fixed-strings
,-E
/--extended-regexp
,-P
/--perl-regexp
,-f file
, dan lainnya.Terkait:
Untuk operasi ATAU , lihat:
sumber
Tempatkan string yang ingin Anda ambil dalam file
Kemudian cari menggunakan -f
sumber
akan mendapatkan baris dengan string1 dan string2 dalam urutan apa pun
sumber
Ini berfungsi untuk pencocokan kata yang tepat dan kata yang tidak sensitif untuk huruf yang cocok, untuk itu -i digunakan
sumber
untuk pertandingan multiline:
atau
kita hanya perlu menghapus karakter baris baru dan itu berfungsi!
sumber
Anda seharusnya
grep
seperti ini:sumber
Saya sering mengalami masalah yang sama seperti masalah Anda, dan saya baru saja menulis sebuah skrip:
Pemakaian:
Anda bisa memasukkannya ke dalam .bashrc jika mau.
sumber
Ketika kedua string berada di urutan kemudian menempatkan pola di antara
grep
perintah:Contoh jika baris berikut ini terkandung dalam file bernama
Dockerfile
:Untuk mendapatkan garis yang berisi string:
FROM python
danas build-python
kemudian gunakan:Maka output hanya akan menampilkan baris yang berisi kedua string :
sumber
ripgrep
Berikut ini contoh penggunaannya
rg
:Ini adalah salah satu alat grepping tercepat, karena itu dibangun di atas mesin regex Rust yang menggunakan automata terbatas, SIMD dan optimisasi literal agresif untuk membuat pencarian sangat cepat.
Gunakan itu, terutama ketika Anda sedang bekerja dengan data besar.
Lihat juga permintaan fitur terkait di GH-875 .
sumber
string2
muncul sebelumnyastring1
. Solusi paling sederhana untuk masalah ini adalahrg string1 file.txt | rg string2
.