Cara membuat bilah vertikal | bekerja di grep?


10

Berikut adalah contoh baris perintah grep yang saya coba:

grep '(565172|565173|565175)' /var/log/cups/error_log

Itu tidak menghasilkan output apa pun, meskipun ketiga nilai berada di file beberapa kali.

Saya mencoba melarikan diri dari jeruji, dan hal itu agak membaik - nilai tengah terdeteksi tetapi bukan yang pertama atau terakhir.

grep '(565172\|565173\|565175)' /var/log/cups/error_log

Saya juga mencoba melarikan diri ganda dan kembali tanpa hasil.

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

Apa yang saya lakukan salah? Terima kasih.

Jawaban:


14

Sintaks yang Anda coba gunakan milik ekspresi reguler yang diperluas, jadi jawabannya sangat sederhana, baik menggunakan egrepatau menyertakan -Ebendera.


17

Apa yang Anda hadapi adalah perbedaan antara ekspresi reguler dasar dan diperluas. Dari halaman manual grep:

Dalam ekspresi reguler dasar, meta-karakter?, +, {, |, (, Dan) kehilangan makna khusus mereka; alih-alih gunakan versi backslashed \ ?, +, {, \ |, (, dan).

Dengan demikian, Anda dapat melakukan salah satu dari yang berikut:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

atau

grep -E '(565172|565173|565175)' /var/log/cups/error_log

Bendera -E mengaktifkan ekspresi reguler "Extended". GNU grep juga mendukung ekspresi reguler yang kompatibel dengan perl.


Mengalihkan perhatian saat menulis jawaban saya. Sepertinya Adam telah memukuliku sampai habis.
Steven D

4
Tetapi Anda menambahkan pada penjelasan - alasan saya tidak bisa membuatnya bekerja adalah bahwa saya hanya melarikan diri dari bar dan bukan parens.
Mark Ransom

1
Saya tidak tahu bahwa Anda dapat keluar dari karakter khusus ini sekali lagi untuk mendapatkan hasil yang sama, jadi beri +1 untuk Anda!
Adam Byrtek

1
Di atas adalah set pertukaran paling beradab yang pernah saya lihat di SO / SE.
mike rodent
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.