Sorot output pencarian konsol, sambil menampilkan seluruh output perintah

19

Ketika saya menggunakan misalnya cat file.txt | grep --color=tty "pattern"saya mendapatkan pola yang saya cari disorot. Ketika saya ingin lebih banyak konteks di sekitar setiap klik, grep memiliki -A, -Bdan -Cparameter.

Namun, saya ingin menampilkan seluruh file (atau output perintah apa pun) dan menyoroti pola tertentu. Apakah ada perintah atau alat sorotan?

DerMike
sumber
Apa yang ingin Anda lakukan sekarang berbeda dari apa yang sudah Anda lakukan?
Benjamin Bannier

Jawaban:

22

Ada jawaban di unix.stackexchange.com yang punya trik rapi ini:

grep -E --color 'pattern|$' file.txt

atau

grep --color 'pattern\|$' file.txt

yang cocok dengan pola Anda atau garis akhir pada setiap baris. Hanya polanya yang disorot.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
+1 Sederhana, dan mudah beradaptasi dengan zgrep, bzgrep, dll. Bagus!
Stefan Lasiewski
Apakah ada cara untuk menghindari mengetik --color sepanjang waktu? Saya pikir ini cukup mendasar untuk menanamkan opsi warna ke grep, tidak yakin mengapa kami secara eksplisit mengetikkan warna setiap saat. Saya mencoba membuat skrip yang mengatakan file grepd memiliki bash yang mengatakan grep --color $ 1 $ 2 tetapi tidak berhasil. Petunjuk apa pun di sini untuk memperbaikinya tolong
Srujan Kumar Gulla
1
@lordlupine: Tambahkan GREP_OPTIONS='--color'ke Anda ~/.bashrc(atau ubah pengaturan untuk disertakan --color). Anda perlu memulai terminal baru atau menjalankan tugas itu di baris perintah di terminal saat ini agar dapat berlaku.
Dijeda sampai pemberitahuan lebih lanjut.
9

Saya suka ack .

ack --passthru somepattern filename

Ini seperti grep, tetapi lebih baik. Ini menyoroti secara default, dan dengan --passthruopsi itu menunjukkan seluruh file (atau input standar) bukan hanya baris yang cocok.

Adam Batkin
sumber
1
Jika Anda mencoba menyalurkan output ke ack, misal dari tail, maka Anda perlu menggunakan --filteropsi ini juga. Misalnya:tail -f myLogFile | ack --filter --passthru pattern
sparrowt
5

Saya juga merekomendasikan penggunaan less(atau semacamnya), tetapi saya ingin menunjukkan kepada Anda solusi yang lebih taktis. Setelah Anda mendefinisikan fungsi ini:

fungsi highlight ()
{
    sed "s / $ 1 /` tput smso` & `tput rmso` / g" "$ {2: -}"
}

Anda dapat menggunakannya dengan cara ini:

command | highlight pattern
highlight pattern file.txt

Catatan: Versi ini peka terhadap huruf besar-kecil, untuk mengubah yang baru saja ditambahkan isetelah gdalam sedekspresi.

cYrus
sumber
1
Saya akan meminta tputbukan hardcoding nilai-nilai. Dengan cara ini Anda juga menghindari penggunaan echo -e, yang dapat memiliki efek lain.
Ignacio Vazquez-Abrams
Anda benar sekali, saya mencarinya tanpa hasil. Terima kasih.
cYrus
Versi ini tidak memerlukan tanda kurung penangkap dan dapat dijalankan dengan prog | highlight "pattern"atau highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
Dijeda sampai pemberitahuan lebih lanjut.
sedKeterampilan saya pada dasarnya tidak ada. Bagaimana saya harus mengubahnya agar sesuai dengan case case yang sensitif. Lagi pula, saya akan menambahkan itu ke bash_functions saya termasuk. Terima kasih banyak.
DerMike
@DerMike: Sekarang ini case sensitive.
cYrus
3

Melewati -Cuntuk grepdengan nilai yang cukup tinggi akan melakukan hal ini.

Ignacio Vazquez-Abrams
sumber
Aku bersumpah aku punya sesuatu yang lain terakhir kali aku mencobanya. (Masing-masing mencocokkan konteks dengan pemisah '-----' di antaranya.) Sekarang setelah Anda memberi tahu saya, itu berjalan dengan baik :-) Terima kasih.
DerMike
Ini akan memisahkan setiap pertandingan, jika tidak ada konteks yang cukup.
Ignacio Vazquez-Abrams
3

less menyoroti pola, jadi

less -p 'mypattern' file.txt

atau

ridiculously | long | pipe | less

dan kemudian dalam waktu kurang /untuk mencari pola yang akan disorot.

Catatan:

Anda dapat meningkatkan perintah Anda, misalnya
mengatur alias alias grep="grep --color=tty"dan menggunakannya seperti itu:

grep 'mypattern' file.txt;
Coder Kasual
sumber
1
Anda harus menahan diri untuk tidak menggunakan GREP_OPTIONS, gunakan alias. lihat: bugs.launchpad.net/ubuntu/+bug/67141
lesmana
Primum non nocere. dihapus.
Casual Coder
GREP_OPTIONS digunakan oleh banyak bentuk grep(zgrep, bzgrep, bzfgrep, dll.) Jadi, jika Anda ingin semua bentuk grep berperilaku konsisten, Anda harus menetapkan alias untuk setiap bentuk grep. @ Casual's jawaban baru di atas tidak akan untuk dengan sesuatu seperti bzgrep pattern /var/log/messages.?.gz, yang merupakan contoh di mana penyorotan warna menjadi SANGAT membantu.
Stefan Lasiewski
1

Ada alat supercat yang bagus , yang melayani persis tujuan itu. Keduanya dapat mewarnai keluaran konsol Anda dan menghasilkan html "yang disorot" dari input Anda.

Ivan Tarasov
sumber
Terima kasih, itu terlihat menjanjikan. Namun, saya sepertinya tidak bisa membuatnya bekerja saat ini.
DerMike
1
Lihatlah file config-nya (di /etc/supercatUbuntu), yang mengatur aturan pewarnaan, mereka pada dasarnya adalah pasangan warna / regexp (dengan beberapa aturan tambahan); halaman manual juga pendek dan bagus.
Ivan Tarasov
Saya menemukan spcrcfile sintaks vim di vim.org/scripts/script.php?script_id=2676
DerMike