Bagaimana saya bisa menyoroti pertandingan menggunakan grep GNU?


18

Saya telah melihat di beberapa Linux, yang grepdikonfigurasi untuk menyorot pertandingan, dan mencetak file yang cocok.

Bagaimana saya bisa mengonfigurasi grepuntuk menyorot kecocokan?

Jawaban:


10
alias cgrep='grep -nR --color'

Pemakaian:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

Juga salah satu favorit saya:

$ pgrep some-hanging-process

akan mencantumkan semua proses yang cocok dengan nama beberapa proses-gantung yang dapat Anda gunakan dalam situasi berikut:

$ kill $(pgrep some-hanging-process)

12
ada perintah pkill untuk yang terakhir
diega

1
Dengan versi GNU terbaru grep, grep -rumumnya harus lebih disukai daripada grep -Ryang sebelumnya tidak melintasi symlink.
Stéphane Chazelas

19

Saya telah menemukan bahwa cara terbaik untuk mucikari grep adalah dengan menggunakan ack , yang pada dasarnya adalah grep rekursif dengan daftar pengabaian yang cerdas (misalnya, tidak mencari direktori .svn, mengabaikan file cadangan, dll.), Menyoroti warna hasil dan perl regexps. Itu yang ingin Anda lakukan 98,6% dari waktu.


5
+1 untuk menyebutkan ack. Jangan lupa untuk menyertakan opsi --pager = "less -R" untuk mempertahankan highlighting untuk hasil paginasi. Mungkin juga layak disebutkan bahwa di Ubuntu, itu disebut sebagai "ack-grep" karena "ack" diambil.
Shawn Chin

Saya menggunakan ACK juga, tetapi kadang-kadang Anda tidak memilikinya tersedia ..
elmarco

2
Karena ack hanyalah skrip perl, Anda dapat membuatnya tersedia di mana pun Anda telah memasang perl, yang bukan bilah tinggi.
Kai

Ack baik untuk default out-of-the-box, tetapi dalam waktu yang Anda perlukan untuk menginstal ack, Anda bisa mengonfigurasi beberapa default untuk grep - lihat jawaban saya di bagian lain halaman ini. Saya melakukan ini sekali pada 1980-an, dan sejak itu grep telah melakukan semua yang dilakukan ack. (hanya grep yang sebenarnya lebih cepat, meskipun ack mengklaim sebaliknya)
Jonathan Hartley

7

Saya mengatur ini di .bashrc saya, alih-alih mendefinisikan ulang grep menggunakan alias:

    export GREP_OPTIONS="--color=auto"

Bagi saya, ini berfungsi di Linux, MacOSX & FreeBSD.


GREP_OPTIONSharus dianggap berbahaya. Saya sarankan untuk menggunakannya alias. Lihat di sini: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

Saya setuju bahwa GREP_OPTIONS dapat menjadi masalah dalam skrip tertentu. Tetapi seperti yang saya katakan pada bug 67141 , GREP_OPTIONS memungkinkan pengguna mengatur satu opsi untuk banyak bentuk grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep, dll.), Sedangkan alias perlu diatur untuk setiap bentuk * grep, dan ada banyak jenis grep.
Stefan Lasiewski

Saya biasa menggunakan GREP_OPTIONS selama bertahun-tahun (bahkan puluhan tahun), tetapi kerusakan yang ditimbulkannya sangat nyata. Setiap alat yang memanggil grep dengan set env var ini akan mewarisi perilaku default Anda yang dimodifikasi, dan ini AKAN merusak alat-alat itu. Hindari masalah ini sepenuhnya dengan mendefinisikan alias atau skrip wrapper yang dapat dieksekusi.
Jonathan Hartley

Script harus membersihkan lingkungan mereka. Tidak ada ifs, buts, atau howevers diizinkan. Titik. (Ya, itu adalah sakit kerajaan di punggung bawah ...).
vonbrand

3

Saya akan merekomendasikan menghindari variabel lingkungan GREP_OPTIONS, itu akan mempengaruhi setiap doa grep, bahkan yang tertanam dalam alat lain. Jika alat-alat itu berharap grep berperilaku satu arah, dan Anda mengubah perilaku itu, alat itu akan dan memang merusak alat-alat itu.

Sebagai gantinya, Anda dapat membuat alias, yang berfungsi dengan baik. Ini hanya akan memengaruhi panggilan untuk mengambil dari shell interaktif Anda (mis. Anda mengetik sendiri).

Opsi terakhir, yang paling saya sukai, adalah membuat skrip wrapper yang memanggil grep. Saya lebih suka ini daripada alias, karena saya bisa meminta bungkus ini dari program lain. Misalnya dalam vim dengan mengatur vimgrep, sehingga pencarian saya dari dalam vim berperilaku identik dengan pencarian di baris perintah.

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

Aktifkan ini menggunakan:

$ grp pattern dir

misalnya

$ grp pattern .

akan mencari contoh 'pola' di semua file teks di dir dan subdir saat ini.

Perhatikan bahwa saya memanggil skrip saya 'grp', daripada membayangi 'grep', sehingga saya selalu sadar apakah saya memohon grep dengan default yang disesuaikan atau tidak.

Secara default saya sertakan:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

Saya pikir semua orang ingin melewatkan dirs kontrol sumber: .hg .git .bzr .svn

Melompati 'build' dan 'dist' adalah Python-isme, dan mungkin tidak berlaku untuk kebanyakan orang. Tidak diragukan lagi Anda akan mengembangkan keanehan Anda sendiri saat bekerja.

'tag' adalah output dari ctags, yang saya gunakan untuk 'pergi ke definisi fungsi' dan sejenisnya di alat seperti vim. Karena itu berisi setidaknya satu salinan dari setiap kata dan simbol dari kode sumber saya, jadi ada baiknya dilewati dari hasil pencarian Anda.

"$ *" pada akhirnya adalah sintaks bash untuk "dan semua params lainnya dari baris perintah", sehingga Anda dapat meneruskan dalam pola dan dir untuk mencari seperti biasa, dan menimpa bendera baris perintah lainnya yang Anda inginkan .


2

The --colorpilihan telah telah disebutkan beberapa kali, tapi saya ingin menambahkan bahwa hal itu mungkin untuk mengkonfigurasi warna di mana pertandingan akan disorot menggunakan variabel lingkungan

export GREP_COLOR="1;33"

Warna harus dikodekan menggunakan kode warna ANSI, untuk referensi

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

1
GREP_COLORsudah ditinggalkan. Gunakan GREP_COLORSsebagai gantinya.
g33kz0r

2

Karena saya tidak melihat contoh pengaturan warna sebenarnya, berikut ini adalah pengaturan sederhana untuk GNU grep:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

Berhati-hatilah GREP_OPTIONS; jangan menggunakannya untuk hal lain selain hal-hal seperti --color=autoatau itu akan mengacaukan skrip yang menggunakan grep pada sistem Anda.

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.