grep -A 2 -B 3
mencetak 2 baris setelah grep string dan mencetak 3 baris sebelumnya.
grep -C 3
mencetak 3 Garis sebelum dan 3 garis sesudahnya
Sayangnya, grep
saya menggunakan tidak mendukung opsi ini. Apakah ada perintah atau skrip alternatif yang tersedia untuk mensimulasikan ini? Menggunakan sed
/ awk
/ perl
/ skrip shell?
text-processing
grep
awk
perl
Prashant Bhate
sumber
sumber
-C
saklar.GNU > /usr/local
. Program GNU memiliki banyak ekstensi yang sangat berguna, dan dirancang untuk menghindari pembatasan sewenang-wenang (tetapi Anda membayar dalam ukuran besar dan kadang-kadang kinerja). Banyak sistem propietary memiliki repositori paket "tidak resmi" dengan GNU dan alat-alat lainnya. "Mitra" tidak akan memberi tahu Anda tentang mereka, bahkan ketika mereka dikelola oleh vendor ...Jawaban:
Salah satu cara jelek untuk melakukannya adalah
atau ganti
-c
dengan-C NUM
untukNUM
garis konteks. Ini akan menghasilkan output ekstra. (Jika Andadiff
mendukung-u
/-U NUM
, itu akan lebih bersih.)Jika Anda
diff
tidak memiliki-c
/-C
/-u
, masih ada cara untuk melakukannya, tetapi mereka sangat jelek. Di sisi lain, sistem yangdiff
bahkan tidak mendukung-c
mungkin juga tidak memiliki Perl.sumber
grep -v pattern file | diff -c - file
Jack hanya membutuhkan Perl, dan termasuk
-A
,-B
dan-C
pilihan yang bekerja seperti grep ini. Ini menggunakan sintaks regex Perl bukan grep, dan cara memilih file untuk pencarian sangat berbeda. Anda mungkin ingin mencoba-f
opsi ketika menggunakannya (yang mencetak file yang akan dicari tanpa benar-benar mencari apa pun).Itu dapat diinstal sebagai skrip tunggal yang tidak memerlukan modul non-inti. Cukup taruh di
~/bin
direktori Anda (atau di mana pun di PATH Anda bahwa Anda memiliki akses tulis) dan pastikan ituchmod
dieksekusi.sumber
ack
digunakan sendiri.Skrip perl sederhana ini ditiru
grep -A
hingga batas tertentuPerhatikan bahwa Anda dapat menambahkan pernyataan penggunaan, agar skrip dapat dibaca dan digunakan;)
sumber
grep-A 3 foo
terlihat jauh lebih alami daripadagrep-A foo 3
. :-)Anda cukup menginstal GNU grep atau Ack (ditulis dalam Perl, memahami banyak opsi GNU grep dan banyak lagi).
Jika Anda lebih suka tetap menggunakan alat standar ditambah sedikit skrip, berikut ini adalah skrip awk yang mengemulasi perilaku GNU grep
-A
dan-B
opsi. Diuji minimal.Jalankan sebagai di
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
manaPATTERN
pola untuk mencari ( ekspresi reguler yang diperluas dengan beberapa penambahan awk ), danNBEFORE
danNAFTER
adalah jumlah baris untuk dicetak masing-masing sebelum dan setelah pertandingan (default ke 0). Contoh:sumber
{ "exec" "awk" "-f" "$0" "$@"; }
: cara yang sangat bagus untuk menyiasati keterbatasan dalam parsing garis shebang.Ternyata cukup sulit untuk meniru -B, karena masalah yang muncul ketika Anda memiliki garis yang cocok mengikuti satu sama lain secara langsung. Ini cukup banyak melarang menggunakan segala jenis pemindaian file pass-through tunggal.
Saya menyadari hal ini saat bermain-main dengan perkiraan berikut:
Ini akan bekerja kira-kira dengan benar seperti grep -A7 -B3, dengan peringatan yang dijelaskan dalam paragraf pertama.
Solusi alternatif (juga file tunggal) untuk masalah ini adalah dengan menggunakan perl untuk memberi makan melalui string perintah:
sumber
shift @A if push(@A,$_)>7;
bit hanya membuat sebuah array dari ukuran maksimum 7 sekitar. (Itu -A parameter Anda). Pilihan kedua menyimpan file yang sangat kecil di sekitar (jalankan perl tanpa lapisan luar sed untuk melihat apa yang dihasilkan di sana), tetapi itu membaca file dua kali.Menggunakan
sed
Anda pertama-tama bisa mendapatkan nomor baris dari garis yang cocok, mengurangi & menambah nomor baris yang diberikan dalam satuwhile
lingkaran dan kemudian gunakansed -n "n1,n2p"
untuk mencetak garis konteks leading (n1
) dan trailing (n2
) (mirip dengansed
alternatif yang disarankan oleh pengguna455). Banyak proses membaca dapat menyebabkan hit kinerja.ed
dapat secara langsung mereferensikan garis sebelumnya dan berikut dari garis yang cocok, tetapi gagal jika rentang garis yang ditentukan tidak ada; misalnya, baris yang cocok adalah baris nomor 2, tetapi 5 baris pra-pertandingan harus dicetak. Menggunakaned
karena itu perlu untuk menambahkan jumlah yang sesuai baris (kosong) pada awal dan akhir. (Untuk file besared
mungkin bukan alat yang tepat, lihat: bfs - pemindai file besar ).sumber