Bisakah grep menunjukkan konteks, tetapi bukan baris penuh?

3

Saya punya file dengan beberapa baris yang sangat panjang. Saya ingin mengambil string yang mungkin terjadi beberapa kali dalam file, termasuk mungkin lebih dari sekali pada satu baris.

$ cat 2014-11-03.json | grep 218

Ini menghasilkan output yang tidak dapat dibaca. Terlalu banyak.

$ cat 2014-11-03.json | grep -o 218

Ini mengurangi terlalu banyak. Ini hanya menunjukkan pola yang cocok tanpa konteks apa pun.

Pada dasarnya, saya ingin output seperti

... <category_id>218</category_id> ...

(Ya, ini XML, tapi saya tidak ingin mem-parsing XML. Saya hanya ingin menampilkan string yang cocok dengan beberapa karakter di kedua sisinya. Hanya beberapa karakter, bukan seluruh baris.)

Grep tampaknya memiliki opsi untuk ditampilkan hanya string yang cocok, atau string yang cocok dalam konteks baris penuh (perilaku default), atau string yang cocok dalam konteks beberapa baris sebelum dan sesudah, tetapi saya tidak dapat menemukan opsi untuk menampilkan string yang cocok dalam konteks beberapa karakter sebelum dan sesudah.

$ cat 2014-11-03.json | tr ' ' '\n' | grep 218 

Itu tidak ideal: ini berfungsi selama file tersebut memiliki spasi di tempat yang kira-kira tepat. Ini bekerja untuk saya saat ini, tetapi tidak ada jaminan itu akan terjadi lagi.

TRiG
sumber
Saya menemukan bahwa menggunakan filter seperti sed <XMLfile 's/></>\n</g' | grep ... sangat membantu saat menangani file XML tanpa baris baru.
AFH

Jawaban:

7

Pertanyaan ini sudah lama, tetapi karena saya sengaja menemukannya saat mencari cara untuk hanya menangkap sebagian dari sebuah baris, begini:

Solusinya adalah untuk mengaktifkan opsi 'hanya-cocok' dan kemudian menggunakan kekuatan RegExp untuk mendapatkan sedikit lebih banyak daripada teks Anda:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

Tentu saja, jika Anda menggunakan penyorotan warna, Anda selalu dapat menangkap lagi untuk hanya mewarnai kecocokan nyata:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

catatan:

  • ini mungkin tidak mengembalikan semua hasil yang diharapkan jika Anda memiliki beberapa kecocokan per baris:. {0,50} mungkin cocok dengan bagian dari kecocokan berikut dan dengan demikian mencegah kecocokan.
  • Regex ini lambat. Sangat lambat. (lihat komentar untuk solusi yang mungkin)
Jehan Bruggeman
sumber
1
Salah satu opsi untuk mempercepatnya adalah menjalankannya setelah mengambil baris yang mengandung WHAT_I_M_SEARCHING untuk mengurangi cakupan.
Jozef Legény
Ide yang bagus
Jehan Bruggeman
0

Taruhan saya tahu cara menampilkan json dalam format cantik menggunakan pjson. Setelah format, Anda dapat menambahkan perintah grep Anda.

$ echo '{"test1":"t1","test2":"t2"}' | pjson
{
   "test1": "t1",
   "test2": "t2"
}

Instal dengan pip:

pip install pjson

dan kemudian, pipa semua konten json ke pjson.

jherran
sumber
Apa yang saya dapatkan adalah XML yang aneh dibungkus dalam JSON. Ini adalah string XML yang sangat panjang, sehingga bahkan formatter JSON mungkin akan meninggalkan garis yang sangat panjang. Saya pikir solusi yang lebih umum, tidak peduli apa format file log, lebih cocok. (Selain itu, meskipun .json ekstensi, itu tidak benar JSON: setiap baris adalah dokumen JSON independen.)
TRiG