Saya mencoba untuk mendapatkan setiap perintah grep untuk menyorot hasilnya dalam warna yang berbeda. Saya bisa melakukannya secara manual dengan garis seperti ini:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
Setiap c
karakter akan disorot dalam warna hijau dan setiap o
karakter akan disorot dalam warna merah, dll ...
Agar contoh ini berfungsi, Anda harus memastikan bahwa Anda selalu memiliki
--color=always
perintah grep. Saya telah mengatur ini di.bashrc
grep saya agar selalu memiliki warna:
export GREP_OPTIONS='--color=always'
Apa yang saya coba capai adalah membungkus fungsi ini dengan alias sehingga saya bisa menelepon grep
dan memiliki GREP_COLORS
nilai yang berbeda setiap kali. Saya memahami pertimbangan beberapa shell untuk setiap grep yang disalurkan baru dan saya mencoba untuk mengatasi ini dengan membuat beberapa file (satu untuk setiap warna), untuk menunjukkan bahwa mereka telah digunakan.
Saya telah melakukan beberapa upaya tetapi anehnya, yang ini tampaknya bekerja dengan "yang terbaik". Saya memiliki ini di .bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
Saya menggunakan alias ini seperti ini:
ll | mg c | mg o | mg n | mg f
Hasilnya cukup keren. Namun ada beberapa kesalahan yang sedikit berbeda setiap kali. Berikut ini beberapa tangkapan layar:
Sepertinya shell melewati setiap perintah pipa, fungsi sebelumnya belum menyelesaikan eksekusi. Mencoba menghapus file yang tidak ada lagi. Saya tidak terlalu yakin dari mana command not found
kesalahan-kesalahan lain itu berasal.
Seperti yang Anda lihat, saya telah memasukkan beberapa wait
perintah untuk mencoba membiarkan manipulasi file selesai tetapi ini tampaknya tidak berfungsi dengan baik. Hal lain yang sudah saya coba adalah menggunakan memori bersama /dev/shm
tetapi menghasilkan hasil yang serupa.
Bagaimana cara saya mendapatkan hasil yang saya inginkan?
catatan:
Saya mencari jawaban yang hanya membungkus perintah grep karena memiliki banyak fungsi yang ingin saya gunakan dan bermaksud untuk memasukkan logika lain di antara pipa, jadi saya tidak ingin memberikan semua istilah pencarian sekaligus. Saya juga tidak mencari alat "grep like" lainnya. Maaf untuk @terdon yang telah memposting saran perl yang mengagumkan.
alias mg="mygrep; grep"
?mygrep;
berubah menjadi perintah baru dalam dirinya sendiri dan aliran data hilang. Pipa yang masuk darils
akan diteruskan kemygrep;
dan tidak untuk grep. Setidaknya begitulah cara saya memahaminya.--color=always
semua perintah grep Anda. Saya telah mengaturnya secara global di.bashrc
. Saya sudah mengeditnya di posting.Jawaban:
Ini pendekatan yang berbeda. Saya punya skrip Perl kecil yang sudah saya posting di jawaban lain yang akan menyoroti pola yang disediakan pengguna dalam warna yang berbeda. Versi skrip yang sedikit dimodifikasi akan bertindak seperti
grep
:Jika Anda menyimpan skrip itu sebagai bagian dari skrip
cgrep
AndaPATH
dan membuatnya dapat dieksekusi, Anda dapat menentukan hingga 10 pola berbeda, yang masing-masing akan dicetak dalam warna berbeda:sumber
Setiap doa
grep
dalam pipa berjalan di shell yang terpisah, jadi Anda harus melewati beberapa keadaan di antara mereka. Solusi berikut adalah cara kasar untuk mengatasinya dengan file yang menjaga indeks warna dan file kunci yang memastikan bahwa panggilan simultan tidak membaca nilai yang sama:Tes dengan asumsi Anda telah memberi nama salinan Anda
cgrep
dan meletakkannya diPATH
:sumber
COLOR_INDEX
danGREP_COLORS
. Saya mencoba mengekspor ini di akhir fungsi tanpa hasil. Apakah itu yang kamu maksud? Cukup untuk dimilikiexport VAR
, bukan?COLOR_TOGGLE
. Terima kasih sudah menangkapnya :)grep "$@"
saran Anda - yang mengurutkan alias untuk menjalankan fungsi lalu grep.Jika Anda mahir dengan ekspresi reguler, Anda mungkin ingin memeriksa grc dan grcat. grc memanggil grcat.
grcat menggunakan file konfigurasi tempat Anda dapat menambahkan ekspresi reguler untuk mencocokkan teks yang akan ditampilkan di setiap warna. Ini juga memiliki sejumlah opsi lain. Ini default untuk mewarnai file log sistem.
Tergantung pada apa yang ada dalam pikiran Anda untuk skrip akhir Anda, Anda mungkin dapat mewarnai hasil Anda hanya dengan satu perintah.
Caranya adalah menentukan regex dengan benar untuk setiap "bidang" di sumber data Anda. Ini akan jauh lebih mudah jika struktur data Anda relatif seragam.
Terakhir kali saya mencobanya, saya tidak terlalu jauh, tetapi saya mungkin harus mencoba lagi karena saya sedikit lebih baik di regex daripada saya dulu.
Ada juga perintah tput yang dapat digunakan untuk mengirim informasi (seperti perubahan warna) langsung ke perangkat terminal Anda.
Kedua pendekatan tersebut dicakup oleh pos di bawah ini. Ini berbicara tentang perintah find, tetapi dapat diterapkan pada output dari perintah apa pun.
Output FIND berwarna?
sumber