Cara menggunakan grep untuk 2 baris berbeda

15

Bagaimana saya bisa mencari dua frasa yang berbeda ketika mereka berada di dua baris yang berbeda dengan menggunakan satu grepperintah?

Sebagai contoh

Baris 1: Ini manis.

Baris 2: lemon.

Saya menggunakan ini tetapi tidak ada hasil

grep "sweet.*lemon" file_type
Vijay Chakraborty
sumber

Jawaban:

20

Untuk menggunakan grepdua baris yang berbeda, cari kedua pola

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Atau gunakan pergantian

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Untuk mendapatkan baris berikutnya setelah suatu pola, Anda bisa menggunakan opsi konteks

$ grep -A1 sweet file_type
This is a sweet
lemon.

Tetapi jika Anda mencari secara eksplisit untuk pola multiline, itu karena sulit grepberpikir dalam garis ... . Anda .*akan menangkap segalanya antara "manis" dan "lemon" di telepon . Kita bisa mendapatkan "lemon" pada baris berikutnya dengan -Pmenggunakan \nuntuk mencocokkan baris baru dan dengan mengatakan grepfile tersebut dipisahkan dengan -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Catatan:

  • -EGunakan ekspresi reguler yang diperluas (untuk menggunakan |karakter untuk pergantian tanpa perlu menghindarinya)
  • -An Cetak garis tambahan setelah pola, di mana n adalah jumlah garis trailing untuk dicetak
  • -PGunakan ekspresi reguler gaya perl ("eksperimental" dalam grep- instal pcregrepsebagai gantinya untuk dukungan perl regex yang lebih baik)
  • -zGunakan karakter nol sebagai pemisah (hanya berpura-pura dalam kasus ini, tetapi grepakan mengambil kata kami untuk itu)
  • -o hanya cetak bagian yang cocok
Zanna
sumber
Sementara grep -zPperintah akan bekerja dalam kasus khusus ini (file yang terdiri dari tepat dua baris) secara umum akan menganggap file biasa yang dipisahkan baris baru sebagai satu baris, sehingga membuang seluruh isi file (jika ada kecocokan di suatu tempat) atau tidak sama sekali; biasanya bukan itu yang digunakan orang grep.
Marc van Leeuwen
ya ini hanya berguna dengan -o... diedit ...
Zanna
Dalam hal ini dicoba di distro lain, Anda mungkin menemukan: grep: The -P and -z options cannot be combined- misalnya grep (GNU grep) 2.5.1 di RHEL
Jason Pyeron
6

Seperti ini:

grep "sweet\|lemon"
Madneon
sumber
maaf tapi ini akan sama persis dengan "sweet | lemon"
αғsнιη
4
@KasiyA Baris ini berfungsi dengan baik. grepoleh karya default dalam "modus standar", di mana "karakter khusus" seperti |, +, *diinterpretasikan secara harfiah kecuali mereka bertopeng dengan garis miring terbalik. Lihat misalnya jawaban ini . Untuk menggunakan cara yang biasa Anda gunakan, bahwa "karakter khusus" perlu disamarkan untuk diartikan secara harfiah, Anda perlu beralih ke "mode perluasan" ( grep -E). Mungkin madneon bisa menguraikan sedikit lebih banyak tentang jawaban-jawabannya, misalnya apa yang dicoba OP akan cocok?
Henning Kockerbeck