Saya tahu bahwa dengan grep saya dapat menggunakan bidang -A
dan -B
untuk menarik garis sebelumnya dan berikutnya dari pertandingan.
Namun mereka menarik semua garis di antara pertandingan berdasarkan berapa banyak baris yang ditentukan.
grep -r -i -B 5 -A 5 "match"
Saya hanya ingin menerima baris ke- 5 sebelum pertandingan dan baris ke- 5 setelah pertandingan selain garis yang cocok dan tidak mendapatkan garis di antara keduanya.
Apakah ada cara untuk melakukan ini dengan grep
?
command-line
grep
awk
chollida
sumber
sumber
grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'
Jawaban:
Alat yang ingin Anda gunakan disebut sift. Ini pada dasarnya grep pada steroid. Grep secara paralel. Sift memiliki sejumlah besar opsi untuk melakukan apa yang Anda inginkan - khususnya untuk mengembalikan garis tertentu relatif terhadap kecocokan yang mungkin / mungkin tidak diikuti / didahului oleh beberapa teks.
Sungguh mengherankan saya bahwa menyaring bukan arus utama gnu seperti yang ditulis dalam bahasa go tetapi menginstal di Linux baik-baik saja. Pencarian IT secara paralel menggunakan semua teks dalam jumlah besar di mana grep hanya membutuhkan waktu berminggu-minggu untuk melakukan hal yang sama.
Ayak situs web - lihat contoh
sumber
Jika:
Kemudian:
sumber
/match/ {matched[NR]}
? Saya belum pernah melihat array atau variabel sebagai keseluruhan perintah. Apakah itu menempatkan nomor catatan saat ini dari setiap baris yang cocok ke dalam array.key in array
. Apa yang saya lakukan adalah mengingat nomor baris di mana polanya munculIni pada dasarnya adalah solusi Glenn, tetapi diimplementasikan dengan Bash, Grep, dan sed.
Perhatikan bahwa nomor baris kurang dari 1 akan membuat kesalahan sed, dan nomor baris lebih besar dari jumlah baris dalam file tidak akan mencetak apa pun.
Ini hanya minimum. Untuk membuatnya bekerja secara rekursif dan menangani kasus-kasus nomor baris di atas akan membutuhkan beberapa pekerjaan.
sumber
Itu tidak bisa dilakukan hanya dengan
grep
. Jikaed
opsi:Script pada dasarnya mengatakan: untuk setiap kecocokan / cocok /, cetak baris 5 baris sebelum itu, lalu 5 baris setelah itu, lalu 5 baris setelah itu.
sumber
ed
adalah selalu jawaban, karenaed
adalah editor teks standar.grep
jawaban, jawaban "Anda tidak dapat melakukannya dengan X, tetapi Anda dapat melakukannya dengan Y, begini caranya" masih merupakan jawaban yang valid karena Anda tidak hanya menjawab pertanyaan OP tetapi Anda juga memberikan alternatif itu akan berhasil. Ini adalah jenis jawaban yang valid di sini.Di sini kita menggunakan awk 's fungsi untuk memanggil eksternal perintah untuk mencetak garis yang awk cocok dengan pola dengan 5 th baris sebelum dan setelah pertandingan.
system(command)
sed
match
Sintaksnya mudah, Anda hanya perlu menempatkan perintah eksternal itu sendiri di dalam tanda kutip ganda serta sakelar-sakelarnya dan melepaskan diri dari hal-hal yang Anda inginkan, secara persis lolos ke perintah, semua yang terkait dengan
awk
opsi itu sendiri harus berada di luar tanda kutip. Jadi sed di bawah ini :Terjemahkan ke:
NR
adalah nomor baris yang cocok dengan polamatch
danFILENAME
merupakan nama pemrosesan saat ini yang lewatawk
.sumber
menggunakan file teks contoh @ glenn dan menggunakan perl bukan awk:
akan memberikan hasil yang sama, tetapi berjalan lebih cepat:
sumber